通过WM_COPYDATA消息完成进程间通信

完成进程间通信最简单的方式就是发送WM_COPYDATA消息。

(1)发送WM_COPYDATA消息

SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&copyData);

其中的copyData是要发送的数据,类型为COPYDATASTRUCT结构体:

typedef struct tagCOPYDATASTRUCT

{

DWORD dwData;

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT;

dwData : Specifies up to 32 bits of data to be passed to the receiving application.

cbData : Specifies the size, in bytes, of the data pointed to by the lpData member.

lpData : Long pointer to data to be passed to the receiving application. This member can be NULL.

该消息只能由SendMessage()发送,而不能使用PostMessage()。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之前,就被系统清除和回收。

如果传入的接收窗口句柄无效或者当接收方进程意外终止时,SendMessage()会立即返回,发送方不会陷入一个无穷等待的状态中。

此外还需注意:

The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.(所发送的数据不能包含数据接收方无法访问的指针或对象引用)

While this message is being sent, the referenced data must not be changed by another thread of the sending process.(消息发送后,要保证lpData所引用数据不能被其它线程修改(直到SendMessage函数返回))

示例代码片段(MFC):

HWND receiveWindow = ::FindWindow(NULL, "CopyDataReceiver");
if (receiveWindow == NULL)
    return; 

CString sendData;
GetDlgItemText(IDC_EDIT_SEND, sendData);

COPYDATASTRUCT copyData = { 0 };
copyData.lpData = sendData.GetBuffer();
copyData.cbData = sendData.GetLength();

::SendMessage(receiveWindow, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copyData);

sendData.ReleaseBuffer();

(2)接收WM_COPYDATA消息:

WM_COPYDATA

wParam = (WPARAM)(HWND) hwnd;

lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

hwnd: Handle to the window passing the data. (数据发送方的句柄,接收方可以通过此句柄向发送方反馈数据)

pcds: Pointer to a COPYDATASTRUCT structure that contains the data to be passed.

Return Values

If the receiving application processes this message, it should return TRUE; otherwise, it should return FALSE.

lParam包含了接收到的数据,在处理之前需要将类型转换为COPYDATASTRUCT结构体。接收方应认为这些数据是只读的,并且只在处理该消息的过程中有效。如果想修改这些数据,应该把它们复制到本地buffer。(The receiving application should consider the data read-only. The pcds parameter is valid only during the processing of the message. The receiving application
should not free the memory referenced by pcds. If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer. )

由于发送方在接收方处理WM_COPYDATA消息完毕前都是处于等待(SendMessage阻塞)中,所以接收方应当尽快处理WM_COPYDATA消息。

示例代码片段(MFC):

BOOL CCopyDataReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    if (pCopyDataStruct->cbData > 0)
    {
        char recvData[256] = {0} ;
        strncpy(recvData, (char *)pCopyDataStruct->lpData, pCopyDataStruct->cbData);
        SetDlgItemText(IDC_EDIT_RECEIVE, (char *)recvData);

        Feedback(pWnd);
    }

    return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

参考资料:

[1] msdn

[2] http://blog.csdn.net/morewindows/article/details/6804157

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 19:44:14

通过WM_COPYDATA消息完成进程间通信的相关文章

利用WM_COPYDATA消息实现进程间通信

进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现. 发送WM_COPYDATA消息: SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM)hSendWnd, (LPARAM)&CopyData); 其中的CopyData为COPYDATASTRUCT结构类型,该结构定义如下: typedef struct tagCOPYDATASTRUCT { DWORD dwData; DWORD cbData; PVOID lpData; } C

VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的

消息作用:    在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT {    ULONG_PTR dwData;    DWORD cbData;    PVOID lpData;} COPYDATASTRUCT, *PCOPYDATASTRUCT; 结构体参数说明:    dwData(ULONG)   保存一个数值, 可以用来作标志等    lpData(void*)   待发送的数据的起始地址

C# 发送WM_COPYDATA消息--网络COPY供个人参考

C# 发送WM_COPYDATA消息 using System.Runtime.InteropServices; [DllImport("User32.dll", EntryPoint = "FindWindow")]         private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);         [DllImport("User32.dll

VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)

转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用:    在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT {    ULONG_PTR dwData;    DWORD cbData;    PVOID lpData;} COPYDATASTRUCT,

windows进程通信 -- WM_COPYDATA消息

WM_COPYDATA消息,在win32中用来进行进程间的数据传输. typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT; 其中dwData为32位的自定义数据, lpData为指向数据的指针,cbData为lpData指针指向数据的大小(字节数). 一般推荐用SendMessage函数进行发送,这样就能确保在接收方复制数据前避免发送方能修改或删除

WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决

在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消 息无法传递.发送程序必须等于或者等于接收程序的权限.如发送与接收 是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样就可以 成功. 以下内容摘自: http://blog.csdn.net/tian_jinping/article/details/12950077 正如我们前文所说,等级的划分,是为了防止以下犯上.所以,有了用户 界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多 限制,它不可以:

跨进程发送消息数据(发送WM_COPYDATA消息,够简单的)

1 //1.发送窗体 2 procedure TForm2.Button1Click(Sender: TObject); 3 var 4 h: HWND; 5 Size: Integer; 6 CopyDataStruct: TCopyDataStruct; 7 begin 8 h := FindWindow(nil, '接收窗口'); { 按标题查找目标窗口 } 9 if h > 0 then 10 begin 11 Size := ByteLength(Edit1.Text) + 2; {

【IPC进程间通信之四】数据复制消息WM_COPYDATA

IPC进程间通信+数据复制消息WM_COPYDATA         IPC(Inter-Process Communication,进程间通信).         数据复制消息WM_COPYDATA是Windows中一个特殊的消息,通过这个消息能够在进程间传递数据.        1.WM_COPYDATA:         WM_COPYDATA消息含两个參数WPARAM wParam和LPARAM  lParam.WPARAM和LPARAM是匈牙利命名法,历史更迭,WPARAM指32位整形

WM_COPYDATA实现的不同进程间通信

进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推送任务.原先想到使用,WCF以实现通信级别的调用,但对于后续新开发的软件来说,所需实现的东西太多(相当于需要实现一个既定接口的服务端).所以选择使用SendMessage,发送一个WM_COPYDATA以实现对新软件的通知任务.其中主要是需要对传输一个对象级的处理,需要进行序列化及反序列货处理,这是