万能的大神,来帮小弟我吧! 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()