我定义了一个结构:typedef struct tagCOMPILEINFO {
CMainFrame* lpMainWnd;
TCHAR* lpCommandLine;
} COMPILEINFO, *LPCOMPILEINFO;
线程函数:UINT CompileThread(LPVOID lpParam)
{
    LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
    ::OutputDebugString(lpInfo->lpCommandLine);
    //为了方便叙述,我用简单的语句作为示例
主函数中调用:  COMPILEINFO CompileInfo;
  CompileInfo.lpMainWnd = this;
  CompileInfo.lpCommandLine = TEXT("test string");
  AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);
调试的时候,那个字符串总是空的,任何地方引用字符串lpInfo->lpCommandLine都会发生访问违规……
我看不出上面的代码有什么问题,请高手指教。谢谢。另外问一下,如何获取由AfxBeginThread函数创建的线程的句柄。因为我要用WaitForSingleObject函数来等待它?貌似AfxBeginThread返回的是一个CWinThread类。

解决方案 »

  1.   

    COMPILEINFO CompileInfo;//在stack中?
      

  2.   

    补充:主函数代码位于 CMainFrame,是它的成员函数
      

  3.   

    TCHAR* lpCommandLine;分配储存空间试试
    或者直接写成
    TCHAR lpCommandLine[250];
      

  4.   

    COMPILEINFO CompileInfo 这个是局部变量。所以函数结束后,就已经无效了。而线程还没有结束。
    AfxBeginThread 函数返回 CWinThread*,这个指针里面有线程的Handle。
      

  5.   

    楼上分析的对
    COMPILEINFO *CompileInfo = new COMPILEINFO;
    试试
      

  6.   

    对 用new开辟堆来搞 要不函数一结束就给你释放了
      

  7.   

    不能用局部变量
    CWinThread有个句柄成员m_hThread
      

  8.   

    和全局变量没什么关系吧#include <iostream>
    #include <windows.h>
    using namespace std;typedef struct tagCOMPILEINFO {
        char* lpMainWnd;
        TCHAR* lpCommandLine;
    } COMPILEINFO, *LPCOMPILEINFO;DWORD WINAPI ThreadProc( LPVOID lpParam )
    {   
        LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
    cout<<lpInfo->lpCommandLine<<endl;
        //::OutputDebugString(lpInfo->lpCommandLine);
        //为了方便叙述,我用简单的语句作为示例
    cout<<"Thread end"<<endl;
    return 0;
    }int main(void) 
    {
    COMPILEINFO test;
    test.lpCommandLine = new char[10];
    ::memcpy(test.lpCommandLine, "Test", 5);
    DWORD ThreadId;
    HANDLE h;
    h = ::CreateThread(NULL, 0, ThreadProc, &test, 0, &ThreadId);
    ::WaitForSingleObject(h, INFINITE);
        CloseHandle(h);
        return 0;

      

  9.   

    你自己到后边加个 delete [] 不就行了?
    说了只是个测试
      

  10.   


      COMPILEINFO CompileInfo;
      CompileInfo.lpMainWnd = this;
      CompileInfo.lpCommandLine = TEXT("test string");
      AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);
    你这个问题在于CompileInfo的生命周期是不是比线程的长!!!
    如果在AfxBeginThread后没有阻塞,函数直接退出的话就会出现上面的问题。11楼的没有出现你的那个问题是因为线程起来后在等待线程退出才向下    COMPILEINFO test;
        test.lpCommandLine = new char[10];
        ::memcpy(test.lpCommandLine, "Test", 5);
        DWORD ThreadId;
        HANDLE h;
        h = ::CreateThread(NULL, 0, ThreadProc, &test, 0, &ThreadId);
        ::WaitForSingleObject(h, INFINITE);   // 如果没有这句就和你那样有一样的问题
    处理:  LPCOMPILEINFO lpCompileInfo = new COMPILEINFO;;
      lpCompileInfo->lpMainWnd = this;
      lpCompileInfo->lpCommandLine = TEXT("test string");  // 这个你这样定义字符常量没问题// 或者重新分配内存再赋值
    //--------------------------
      lpCompileInfo->lpCommandLine = new TCHAR[32];
      memset(lpCompileInfo->lpCommandLine, 0, 32);
      _tcscpy(lpCompileInfo->lpCommandLine, TEXT("test string"));
    //--------------------------
      AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);// 线程函数,需要释放内存
    UINT CompileThread(LPVOID lpParam)
    {    
        LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
        ::OutputDebugString(lpInfo->lpCommandLine);    // ……
        // 如果字符串是new出来的也需要释放
        // ----------------
        delete[] lpInfo->lpCommandLine;
        lpInfo->lpCommandLine = NULL; 
        // ----------------   
        // 释放传进来的参数
        delete lpInfo;
        lpInfo = NULL;
    }
      

  11.   


    MSDN查一下CWinThread就知道了
    CWinThread有一个公开的类变量HANDLE m_hThread;
    你等待这个就可以了