进程间通信最简单的方式就是发送WM_COPYDATA消息。
发送WM_COPYDATA消息:
SendMessage(接收窗口句柄,WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&CopyData);
其中的CopyData为COPYDATASTRUCT结构类型,该结构定义如下:
typedef struct tagCOPYDATASTRUCT {
开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理。对于传递少量数据的情况,最简单的就是用SendMessage发送WM_COPYDATA消息,所带参数wParam和lParam可以携带相关数据。由于SendMessage是阻塞的,在接收数据进程处理完数据之前不会返回,发送方不会删除或修改数据,因此这种方法是简单且安全的,不过数据量不能太大,否则会由于处理时间过长造成阻塞假死。
| |
| |
| |
| |
| |
|
前面这段是转载的.自己最近再次去深究核心编程,这里给出的例子也是父进程与子进程之间进行通讯的方式:
父进程:
#include <Windows.h>
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include "CString.h"
using namespace std;
void main()
{
STARTUPINFO si = {sizeof(STARTUPINFO)};
SECURITY_ATTRIBUTES saProcess,saThread;
PROCESS_INFORMATION poProcessChild;
DWORD dProcessID = GetCurrentProcessId();
TCHAR str[100];
wsprintf( str,TEXT("%s %ld"),TEXT("E:\\测试程序\\2012-8-5\\RecvProcess\\Debug\\RecvProcess.exe"),dProcessID );
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = TRUE;
saThread.nLength = sizeof( SECURITY_ATTRIBUTES );
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = TRUE;
saProcess.nLength = sizeof( SECURITY_ATTRIBUTES );
BOOL bCreate = CreateProcess( NULL,str,&saProcess,&saThread,TRUE,CREATE_SUSPENDED,NULL,NULL,&si,&poProcessChild );
HWND hWnd = FindWindow( NULL,TEXT("RecvProcess") );
ResumeThread( poProcessChild.hThread );
COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/
cpd.dwData = 0;
cpd.cbData = dProcessID;
cpd.lpData = NULL;
SendMessage( hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd );
Sleep( 1000 );
}
接收端:
DWORD ProcessID = pCopyDataStruct->cbData;
或者使用命令行:
CString strCommandLine = GetCommandLine();
MessageBox( strCommandLine );