万能的大神,来帮小弟我吧! CreateThread()的有关问题。
万能的大神,来帮我吧!!~~ CreateThread()的问题。。。
//CServerDlg.h文件
class CServerDlg : public CDialog
{
...
protected:
...
void CServerDlg::InsertResultString(CString new_string);
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
...
}
//然后CServer.cpp中
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
{
CServerDlg* pDlg = (CServerDlg*)lpparam;
...
pDlg->InserResultString(strTemp);
...
}
void CServerDlg::OnBnStartsvr()
{
...
HANDLE m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,(LPDWORD)&dwThreadID);
...
}
问题1:就按照上面这样编译的话,好 报错了:
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
于是根据网上各种资料得知ListenThread()函数声明为static可以解决,于是在protected里面将
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
变更为
static DWORD WINAPI ListenThread(LPVOID lpparam);//同时去掉类名跟域作用符
之后编译。。。。
问题2:按问题1的解决办法编译,又报错:
error C2248: 'InsertResultString' : cannot access protected member declared in class 'CServerDlg'
原因是ListenThread()函数中调用了类内的Protected成员函数InserResultString()。。。于是继续
将InsertResultString()函数声明为Public
public:
void CServerDlg::InserResultString();
编译后继续报错
问题3:按问题2的情况编译后 报错:
ServerDlg.obj : error LNK2001: unresolved external symbol "protected: static unsigned long __stdcall CServerDlg::ListenThread(void *)" (?ListenThread@CServerDlg@@KGKPAX@Z)
Debug/Server.exe : fatal error LNK1120: 1 unresolved externals
中间还牵扯到InserResultString()函数调用了GetDlgItem()函数,如果InserResultString()没带上类名跟域作用符CServer
::的话,GetDlgItem()只剩一种重载——GetDlgItem(HWND hDlg,int nIDDlgItem)这些蛋疼的问题。。。
但是不管怎么改都会有错。。。
折磨我一下午了。。。。。。。。有大神来的话快点拯救我吧。。。
------解决方案--------------------
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam); 用 static的
static DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
------解决方案--------------------
ListenThread中通过发送消息的方式给主线程,然后由主线程来调用InserResultString()
//CServerDlg.h文件
class CServerDlg : public CDialog
{
...
protected:
...
void CServerDlg::InsertResultString(CString new_string);
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
...
}
//然后CServer.cpp中
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
{
CServerDlg* pDlg = (CServerDlg*)lpparam;
...
pDlg->InserResultString(strTemp);
...
}
void CServerDlg::OnBnStartsvr()
{
...
HANDLE m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,(LPDWORD)&dwThreadID);
...
}
问题1:就按照上面这样编译的话,好 报错了:
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
于是根据网上各种资料得知ListenThread()函数声明为static可以解决,于是在protected里面将
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
变更为
static DWORD WINAPI ListenThread(LPVOID lpparam);//同时去掉类名跟域作用符
之后编译。。。。
问题2:按问题1的解决办法编译,又报错:
error C2248: 'InsertResultString' : cannot access protected member declared in class 'CServerDlg'
原因是ListenThread()函数中调用了类内的Protected成员函数InserResultString()。。。于是继续
将InsertResultString()函数声明为Public
public:
void CServerDlg::InserResultString();
编译后继续报错
问题3:按问题2的情况编译后 报错:
ServerDlg.obj : error LNK2001: unresolved external symbol "protected: static unsigned long __stdcall CServerDlg::ListenThread(void *)" (?ListenThread@CServerDlg@@KGKPAX@Z)
Debug/Server.exe : fatal error LNK1120: 1 unresolved externals
中间还牵扯到InserResultString()函数调用了GetDlgItem()函数,如果InserResultString()没带上类名跟域作用符CServer
::的话,GetDlgItem()只剩一种重载——GetDlgItem(HWND hDlg,int nIDDlgItem)这些蛋疼的问题。。。
但是不管怎么改都会有错。。。
折磨我一下午了。。。。。。。。有大神来的话快点拯救我吧。。。
------解决方案--------------------
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam); 用 static的
static DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam);
------解决方案--------------------
ListenThread中通过发送消息的方式给主线程,然后由主线程来调用InserResultString()