现向CreateThread函数传递一个CString对象,在线程入口函数里显示出来,有问题,源码如下:
{ CString  str("haha");
  ::CreateThread(NULL,0,kk,(LPVOID)&str,0,NULL);}
入口函数 DWORD WINAPI kk(LPVOID lpParameter)
       {   CString str=(LPCSTR)lpParameter;
           AfxMessageBox(str);
            return 0;}
这样弹出对话框为乱码,请问怎样才能在入口函数中正确的获得传递的CString对象?看过一些帖子说不应该传递MFC的对象,如何解决?有正确显示即给分,望高手指点!

解决方案 »

  1.   

    参数改成new CString( "haha" );
      

  2.   

    既然传递的是CString的指针, 取值时也应该使用指针 CString ×str= (CString *)lpParameter; 
     CString str = *((CString *)lpParameter); 
      

  3.   

    DWORD WINAPI kk(LPVOID lpParameter) 
          {  CString str = *((CString *)lpParameter); 
              AfxMessageBox(str); 
                return 0;} 
      

  4.   

    你咋写的?
    该不会线程内没改吧
    CString* pstr=(CString*)lpParameter; 
    类型一致才可以
      

  5.   

    你这里的CString相当于是个临时变量,栈上分配的,你开线程的这个函数结束后系统就自动给你释放了,所以你在另外的线程里面读出来的就是乱码了
    最好是定义个全局变量,或者是new一个传递进去
      

  6.   

    CreateThread 之后是异步的操作,用局部变量作为参数传递肯定是这样的
    参考 xsgluozi 的答案
      

  7.   

    new 出来之后不方便管理什么时候释放。所以还是弄个类静态成员变量好(因为全局变量都是尽量避免)