我想在两个进程间传送字符串,用:WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)这个函数来接收并处理数据,
我知道用oncopydata函数可以,但由于其他功能也是用这个函数来处理消息,所以好像只能用WindowProc来处理数据了
问题是,我该怎么获取另一个进程发送来的字符串?由于水平有限,所以问题描述可能有误,还请指教
我知道用oncopydata函数可以,但由于其他功能也是用这个函数来处理消息,所以好像只能用WindowProc来处理数据了
问题是,我该怎么获取另一个进程发送来的字符串?由于水平有限,所以问题描述可能有误,还请指教
1,a进程向剪贴板设置信息,然后通过消息通知b进程去获取剪贴板字符串剪贴板数据设置
CString source;
//文本内容保存在source变量中
if( OpenClipboard() )
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}下面的代码显示了如何从剪贴板上获得文本内容:char * buffer = NULL;
//打开剪贴板
CString fromClipboard;
if ( OpenClipboard() )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}
还可以自己去Google搜索下
对方受到消息后去打开剪贴板,读取数据。窗口句柄获取可以通过FindWindow获取
在WindowProc中获取消息,再去读取内存,这个是自定义消息的传递方法,顺带将数据一齐发送了过去。内存映射是在虚存中开辟了一块共享的区域,任何程序,任何时间,都能去那里取数据当然你可以两者配合使用,在获得自定义消息后,就去内存映射中取数据
你可以自己去开辟一个共享区域,也可以直接使用剪贴板。都一样可以达到你的目的
//使用内存映射文件(CreateFileMapping) 读取数据
//写数据 "DataCHARGE"为内存映射文件名, 在读数据时所用的内存映射文件名应与之一致。
HANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE | SEC_COMMIT, 0, LENCHARGE, "DataCHARGE");if (hRecvMap != NULL) // STUDENT* 结构体
{
STUDENT* lpData = (STUDENT*)MapViewOfFile(hRecvMap, FILE_MAP_WRITE, 0, 0, 0);
if (lpData == NULL)
{
CloseHandle(hRecvMap);
hRecvMap = NULL;
}//写入数据 此处 pCharge 结构体对象, 在执行此操作前应将你的数据值写入pCharge.
*lpData = pCharge;
UnmapViewOfFile(lpData);
lpData = NULL;//CloseHandle(hRecvMap); //退出程序时执行
///hRecvMap = NULL;
}//读数据 此处"DataCHARGE"为映射文件名, 与CreateFileMapping时的文件名一致
HANDLE m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, TRUE, "DataCHARGE");if (m_hReceiveMap != NULL) // STUDENT* 为结构体
{
STUDENT* lpData=(STUDENT*)MapViewOfFile(m_hReceiveMap, FILE_MAP_READ, 0, 0, 0); if (lpData == NULL) //读出数据
{
CloseHandle(m_hReceiveMap);
m_hReceiveMap = NULL;
} //如果执行到此处, 说明数据已经读取成功。 可在此处输入 lpData 的值测试一下。
CloseHandle(m_hReceiveMap);
} 上面,写数据的代码你写在发送字符串的进程,读数据的代码写在接收字符串的进程。而且,我上面的代码
是传送结构体STUDENT* lpData,你替换一下为字符串格式即可
低级通信:信号量和管程机制。其第一个缺点就是传送信息量小,效率低。第二个缺点就是编码复杂。高级通信:共享缓冲区、管道、消息、邮槽,剪贴板1、使用自定义消息 在windows下WM_USER为0x400,如果自定义消息,可以在它上面加上一个值另一种方式来注册消息,就是RegisterWindowsMessage,它的好处就是不必考虑消息标识的表示范围。SendMessage(WM_MyMsg, NULL,(LPARAM)uMsg);2、使用WM_COPYDATA使用指定的结构来发送,接收消息数据typedef struct tagCOPYDATASTRUCT{DWORD dwData;//自定义数据DWORD cbData;//数据大小PVOID lpData;//指向数据的指针}COPYDATASTRUCT;COPYDATASTRUCT cpd;cpd.dwData = 0; cpd.cbData = length; cpd.lpData = Buffer;SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd); 3.使用内存读写WriteProcessMemory, ReadProcessMemory在进程内存使用VirtualAllocEx通过进程句柄来分配一个空间,使用WriteProcessMemory将信息写入该进程的内存,然后利用消息,将这块内存的基址发送给目标进程,目标进程使用ReadProcessMemory来读取该进程的该块内存. 4、使用内存映射 通过CreateFileMapping 来 创建一段内存映射如CreateFileMapping(0xFFFFFFFF, 0, PAGE_READWRITE, highsize,lowsize,Name);LPSTR basepointer = (LPSTR)MapViewOfFile(m_hMapObj, FILE_MAP_READ,0 ,0,0);在另一个进程OpenFileMapping来打开该共享内存,MapViewOfFile来获取指针,读取之后使用UnmapViewOfFile释放映射,CloseHandle(hMapObj);并关闭句柄 5、使用DLL通信
在dll中建立一个新段来共享数据#pragma data_seg("MyShared") char m_str[256] ;#pragma data_seg()#pragma comment(linker,"/SECTION:MyShared,RWS") 6、使用windows剪贴板
BOOL OpenClipboard();//打开剪贴板BOOL CloseClipboard();//关闭剪贴板BOOL EmptyClipboard();//清空剪贴板HANDLE SetClipboardData();//按指定数据格式放置剪贴板数据,用之前必须使用OpenClipBoard函数BOOL IsClipboardFormatAvailable(UNIT uFormat);7、使用消息管道服务程序:CreateNamedPipe创建命名管道CreateNamedPipe("\\\\.\\pipe\\ssnp\\",RIGHTS,BLOCK_MODE,PIPE_UNLIMITED_INSTANCES,128,128,NULL,NULL);创建线程来监听管道连接管道ConnectNamedPipe(pipe_handle,..);ReadFile,WriteFile....读写内容客户程序:打开管道使用CreateFile使用ReadFile WriteFile来读写内容8、使用邮槽通信CreateMailslot:创建邮槽GetMailslotInfo//阻塞等待数据ReadFile WriteFile收发数据完全类似于管道机制9、使用windows套接字通信全地球人都知道怎么写,就不细说了初始化winsock检查winsock版本服务器端:socket->bind->listen->accept....>read....>write...close客户端socket->connect....>write...>read....>close
文章出处:http://www.diybl.com/course/3_program/c++/cppsl/20071215/92160.html
另外,上面有说用自定义消息的,这个是不行了,自定义消息怎么传字符串呢?传过去的地址又不能用,自定义消息只能是起辅助作用.另外:这一句话我没看明白:
我知道用oncopydata函数可以,但由于其他功能也是用这个函数来处理消息,所以好像只能用WindowProc来处理数据了
用WM_COPYDATA消息为什么不行呢?这个是最简单的方法了!
COPYDATASTRUCT *c = (COPYDATASTRUCT*)lParam;
LPCSTR str = (LPCSTR)(c->lpData);但现在接收到的数据是乱码
这个讲内存映射已经很详细了