我用CreateProcess创建了一个进程,然后想用PostThreadMessage传递主进程窗口的指针和一个整型或者CString类型的参数过去。
子进程接收到了消息,但是取不到参数。应该如何传递这类参数?

解决方案 »

  1.   

    SendMessage必须要知道对方窗口的吧?现在就是不知道对方的窗口,用FindWindow也找不到。
      

  2.   

    可以在 CreateProcess的时候,把主进程窗口句柄当做 子进程的入口参数 传入。字符串的话不能用PostThreadMessage跨进程发送。一种是 1楼的方法,但子进程没有窗口的话,没法用。
    另一种 可以通过 内存文件映射。 还有其他一些比较麻烦点的办法如管道之类的。
      

  3.   


    刚才我也在想这个问题,是不是在LPTSTR lpCommandLine参数中传递?然后在子进程的构造函数中得到这个参数。例如子进程是一个CDialog的派生类,在
    CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSS10UpdateDlg::IDD, pParent)
    中得到pParent或者通过GetCommandLine来获取?
    但是LPTSTR lpCommandLine只能传递字符串吧?
      

  4.   

    把主进程的窗口句柄或者线程ID传递过去,只要让子进程可以发消息过来就可以。然后另外要传递一个CString或者整型的参数。
      

  5.   

    使用GlobalAlloc(GPTR,Size)申请内存,然后使用GlobalFree释放内存
      

  6.   

    奇怪了,还是不行,感觉是我子进程的消息处理函数有问题?大虾们帮我看看
    主进程里面:
    if(CreateProcess("Child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
    long* locPara = NULL;
    locPara = (long*)GlobalAlloc(GMEM_FIXED, sizeof(long));
    *locPara = m_locPara;            //m_locPara是一个long型的变量。
    while(pi.dwThreadId == 0)
    Sleep(1);
    while(!PostThreadMessage(pi.dwThreadId, WM_DO_SOMETHING, 0, (LPARAM)locPara))
    Sleep(1);
                    //释放内存的代码还没写
    }子进程里面:
    ON_THREAD_MESSAGE(WM_DO_SOMETHING, DoSomeThing)
    void CChildApp::DoSomeThing(WPARAM wParam, LPARAM lParam)
     {
    long* mainPara = (long*)lParam;
    CString temp;
    temp.Format("%d", *mainPara);
    AfxMessageBox(temp);
    return;
     }
    子进程执行到temp.Format这句就出错了,感觉是不是LPARAM lParam这个参数根本就是空的?
      

  7.   

    ON_THREAD_MESSAGE(WM_DO_SOMETHING, DoSomeThing)
    void CChildApp::DoSomeThing(WPARAM wParam, LPARAM lParam)
     {
        long* mainPara = (long*)lParam;
        CString temp;
        temp.Format("%X", mainPara);
        AfxMessageBox(temp);
        return;
     }刚试了一下,显示指针地址的话跟传递的值是一样的。为虾米取里面的值就不行了捏
      

  8.   

    忘了,可能这种情况下不能直接使用内存地址,可以考虑使用GlobalAllocPtr/GlobalFreePtr配对,他们之间使用的是Handle,这样子应该可以跨越进程.
      

  9.   

    这种应用最好的办法还是使用CreateFileMapping一类的进行共享内存数据的交换.
      

  10.   

    用了个土办法解决了。
    主进程PostThreadMessage(pi.dwThreadId, WM_TRANS_THREADID, AfxGetApp()->m_nThreadId, 0);//把自己的ThreadId传递过去。
    子进程接收后PostThreadMessage(nThreadId, WM_TRANS_TRHEADID_OK, 0, 0);//通知主进程。
    主进程PostThreadMessage(pi.dwThreadId, WM_TRANS_PARA, locPara, 0);//第二次消息传递参数结贴