线程函数传递到窗口句柄,再获得对话框对象的指针后使用其成员变量,程序报错。不知道错在哪儿?
DWORDWINAPICImportDlg::ThreadProc(LPVOIDlpParam){HWNDhwnd=(HWND)lpParam;CStringstr;CI...
DWORD WINAPI CImportDlg::ThreadProc(LPVOID lpParam)
{
HWND hwnd=(HWND)lpParam;
CString str;
CImportDlg *importdlg=(CImportDlg*)FromHandle(hwnd);
CDataBase db=importdlg->m_db;
str=importdlg->m_strEdit;// 此处报错,importdlg->m_strEdit错误指针
TCHAR strName[20],strAge[4];
int iAge=0;
db.initDB(hwnd);
FILE *pFile=fopen((importdlg->m_strEdit).GetBuffer(40),"r");//此处报错,importdlg->m_strEdit错误指针
fscanf(pFile,"%s %s",strName,strAge);
AfxMessageBox(strName);
AfxMessageBox(strAge);
return 0;
}
已经设为static,想将主对话框中的成员变量传到ThreadProc中,m_strEdit已经在主对话框中有值。
以传递的变量是句柄,通过lPparam得到 展开
{
HWND hwnd=(HWND)lpParam;
CString str;
CImportDlg *importdlg=(CImportDlg*)FromHandle(hwnd);
CDataBase db=importdlg->m_db;
str=importdlg->m_strEdit;// 此处报错,importdlg->m_strEdit错误指针
TCHAR strName[20],strAge[4];
int iAge=0;
db.initDB(hwnd);
FILE *pFile=fopen((importdlg->m_strEdit).GetBuffer(40),"r");//此处报错,importdlg->m_strEdit错误指针
fscanf(pFile,"%s %s",strName,strAge);
AfxMessageBox(strName);
AfxMessageBox(strAge);
return 0;
}
已经设为static,想将主对话框中的成员变量传到ThreadProc中,m_strEdit已经在主对话框中有值。
以传递的变量是句柄,通过lPparam得到 展开
2个回答
展开全部
我有个建议,
传的时候不要传HWND而是传this
转的时候直接从lpParam转成importdlg
你用
CImportDlg *importdlg=(CImportDlg*)FromHandle(hwnd);
这样的方式转换指针是不安全的,FromHandle返回的对象不一定是CImportDlg类型
但是由于指针之间是可以随意强制类型转换的,所以这个转换总是不报错,就算转不出来、转出来不是CImportDlg,也不会报错
传的时候不要传HWND而是传this
转的时候直接从lpParam转成importdlg
你用
CImportDlg *importdlg=(CImportDlg*)FromHandle(hwnd);
这样的方式转换指针是不安全的,FromHandle返回的对象不一定是CImportDlg类型
但是由于指针之间是可以随意强制类型转换的,所以这个转换总是不报错,就算转不出来、转出来不是CImportDlg,也不会报错
追问
得到的是CWind指针,然后转为CImport,但是转换得到的importdlg可以访问成员函数,就是不能访问公有的成员,
追答
可以访问成员函数并不意味着转换是成功的。
成员函数只要不是虚函数,和普通函数实际上内部实现里在调用的时候是一样的,最明显的不同在于你可以在里面用this指针(访问成员变量也属于利用this指针)。
你可以试一下,
class A {
public:
void f() { puts("a"); }
};
A* p = 0;
p->f();
这样的代码,是可以运行的……所以可以调用成员函数并不代表你的转换是正确的
CWnd不一定能成功转成CImportDlg。所以我说指针的强制类型转换在这里是不安全的。你的成员函数,如果是CWnd里就有的,那么可以用没问题,CImportDlg继承自CWnd。如果是CImportDlg里独有的,只要里面没有访问独有的成员变量,也不一定就是会出错。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询