在Windows上使用C ++进行健壮,简单(快速)的进程间通信

时间:2013-09-17 18:00:41

标签: c++ ipc

我正在为两个第三方程序开发一个插件:Windows上的C ++中的A和B(7),并且需要一种强大的,相对简单(快速)的方式来在两个程序之间进行通信。

通信是一种方式:根据程序A中的用户交互,我希望程序A中的插件发送一个信号,最终调用程序B中插件内的函数。

协议很简单。这是我在插件B中的接收函数的签名:

struct XYZ { 
   double x, y, z;
}
void polyLineSelected(long id, std::vector<XYZ> & points);

你会怎么建议这样做?

1 个答案:

答案 0 :(得分:0)

到目前为止,在Windows上实现单向通信的最简单方法是发送WM_COPYDATA消息。它需要一个COPYDATASTRUCT参数来将任意数据从一个应用程序移动到另一个应用程序。

对于您的具体示例,发件人的实现如下所示:

// Declare symbolic constants to identify data
enum DataType {
    DataType_Points
};
// Declare struct to hold compound data
struct IPCData {
    long id;
    XYZ pts[];
};

// Allocate buffer
const size_t bufferSize = offsetof(IPCData, pts[points.size()]);
vector<char> buffer(bufferSize);
IPCData* pData = reinterpret_cast<IPCData*>(&buffer[0]);

// Fill the buffer
pData->id = 42;
copy(points.begin(), points.end(), &pData->pts[0]);

// Prepare COPYDDATASTRUCT
COPYDATASTRUCT cds = { 0 };
cds.dwData = DataType_Points;  // Can be used by the receiver to identify data
cds.cbData = bufferSize;
cds.lpData = pData;

// Send the data
SendMessage(hWndRecv, WM_COPYDATA,
            (WPARAM)hWndSender,
            (LPARAM)(LPVOID)&cds);