PostThreadMessage如何在不同进程见传递参数? 我用CreateProcess创建了一个进程,然后想用PostThreadMessage传递主进程窗口的指针和一个整型或者CString类型的参数过去。子进程接收到了消息,但是取不到参数。应该如何传递这类参数? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SendMessage必须要知道对方窗口的吧?现在就是不知道对方的窗口,用FindWindow也找不到。 可以在 CreateProcess的时候,把主进程窗口句柄当做 子进程的入口参数 传入。字符串的话不能用PostThreadMessage跨进程发送。一种是 1楼的方法,但子进程没有窗口的话,没法用。另一种 可以通过 内存文件映射。 还有其他一些比较麻烦点的办法如管道之类的。 刚才我也在想这个问题,是不是在LPTSTR lpCommandLine参数中传递?然后在子进程的构造函数中得到这个参数。例如子进程是一个CDialog的派生类,在CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CSS10UpdateDlg::IDD, pParent)中得到pParent或者通过GetCommandLine来获取?但是LPTSTR lpCommandLine只能传递字符串吧? 把主进程的窗口句柄或者线程ID传递过去,只要让子进程可以发消息过来就可以。然后另外要传递一个CString或者整型的参数。 使用GlobalAlloc(GPTR,Size)申请内存,然后使用GlobalFree释放内存 奇怪了,还是不行,感觉是我子进程的消息处理函数有问题?大虾们帮我看看主进程里面: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这个参数根本就是空的? 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; }刚试了一下,显示指针地址的话跟传递的值是一样的。为虾米取里面的值就不行了捏 忘了,可能这种情况下不能直接使用内存地址,可以考虑使用GlobalAllocPtr/GlobalFreePtr配对,他们之间使用的是Handle,这样子应该可以跨越进程. 这种应用最好的办法还是使用CreateFileMapping一类的进行共享内存数据的交换. 用了个土办法解决了。主进程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);//第二次消息传递参数结贴 关于VS2010 vc监控文件拷贝 编写ActiveX,碰到一个棘手问题 关于MapViewOfFile和OpenViewOfFile的问题,高手请入 將有介面的DLL做成元件 建议以后csdn以后只允许以英文发贴 CTABCTRL的问题----如何解决?? 如何求两个球的最小包围球 map中放map时候的析构 Excel com加载项崩溃时,如何创建dmp文件 如何用vc6.0访问ActiveSycn生成的文件夹?小弟是新手,各位大侠帮帮忙啊。 在VC++6.0中导入ACTIVE控件出错
另一种 可以通过 内存文件映射。 还有其他一些比较麻烦点的办法如管道之类的。
刚才我也在想这个问题,是不是在LPTSTR lpCommandLine参数中传递?然后在子进程的构造函数中得到这个参数。例如子进程是一个CDialog的派生类,在
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSS10UpdateDlg::IDD, pParent)
中得到pParent或者通过GetCommandLine来获取?
但是LPTSTR lpCommandLine只能传递字符串吧?
主进程里面:
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这个参数根本就是空的?
void CChildApp::DoSomeThing(WPARAM wParam, LPARAM lParam)
{
long* mainPara = (long*)lParam;
CString temp;
temp.Format("%X", mainPara);
AfxMessageBox(temp);
return;
}刚试了一下,显示指针地址的话跟传递的值是一样的。为虾米取里面的值就不行了捏
主进程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);//第二次消息传递参数结贴