Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中健壮、简单(且快速)的进程间通信+;在窗户上 我正在为两个第三方程序开发插件:在Windows(7)上用C++编写的A和B,需要一个健壮的、相对简单的(快速的)方式来实现这两个程序之间的通信。_C++_Ipc - Fatal编程技术网

C+中健壮、简单(且快速)的进程间通信+;在窗户上 我正在为两个第三方程序开发插件:在Windows(7)上用C++编写的A和B,需要一个健壮的、相对简单的(快速的)方式来实现这两个程序之间的通信。

C+中健壮、简单(且快速)的进程间通信+;在窗户上 我正在为两个第三方程序开发插件:在Windows(7)上用C++编写的A和B,需要一个健壮的、相对简单的(快速的)方式来实现这两个程序之间的通信。,c++,ipc,C++,Ipc,通信是一种方式:基于程序A中的用户交互,我希望程序A中的插件发送一个信号,最终调用程序B中插件中的函数 协议很简单。这是我的插件B中接收函数的签名: struct XYZ { double x, y, z; } void polyLineSelected(long id, std::vector<XYZ> & points); struct XYZ{ 双x,y,z; } 已选择无效多段线(长id、标准::矢量和点); 您建议如何执行此操作?到目前为止,在Windo

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

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

struct XYZ { 
   double x, y, z;
}
void polyLineSelected(long id, std::vector<XYZ> & points);
struct XYZ{
双x,y,z;
}
已选择无效多段线(长id、标准::矢量和点);

您建议如何执行此操作?

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

对于您的特定示例,发送方的实现如下所示:

// 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);
//声明符号常量以标识数据
枚举数据类型{
数据类型\u点
};
//声明结构以保存复合数据
结构数据{
长id;
XYZ-pts[];
};
//分配缓冲区
const size_t bufferSize=offsetof(IPCData,pts[points.size());
向量缓冲区(缓冲区大小);
IPCData*pData=重新解释强制转换(&buffer[0]);
//填满缓冲区
pData->id=42;
复制(points.begin()、points.end()、&pData->pts[0]);
//准备COPYDDATASTRUCT
COPYDATASTRUCT CD={0};
cds.dwData=DataType_Points;//可由接收器用于识别数据
cds.cbData=缓冲区大小;
cds.lpData=pData;
//发送数据
发送消息(hWndRecv、WM_COPYDATA、,
(WPARAM)hWndSender,
(LPARAM)(LPVOID)和cds);

boost进程间?有一点是可以肯定的,那就是很容易使用“每笔交易”有多少数据?(例如,
向量有多大?
?非常小。比如说最多20个点,通常只有4个点。管道或内存映射文件似乎是合理的。我可能会使用命名管道……我对这个方法不熟悉,只是通过一个示例仔细阅读了一下。我对调用方(A)的理解是否正确使用进程B的名称向其发送消息,并且该进程B像从操作系统接收任何其他事件一样接收消息?@Andy调用者需要知道接收者的
HWND
。处的示例代码使用目标窗口的名称检索句柄。无论哪种方式,发送者都需要检索接收者的窗口句柄。在rec上接收端您可以像处理任何其他消息一样处理
WM_COPYDATA
。@Zac不,您永远不想使用
PostMessage
。请阅读:“发送此消息时,发送过程中的其他线程不得更改引用的数据。”您想阻止发送方(A)直到接收方(B)已完成邮件处理。抱歉,我的观点被打断。如果您使用
SendMessage
,您在A中的线程将被阻止,直到B处理它。如果B不处理它(或处理它需要很长时间),A将保持死锁。如果使用此机制来回发送数据,则可以轻松地使两个程序都死锁。B将消息发送给A,并等待A处理消息,然后再从SendMessage调用返回。如果A不处理消息,则B在SendMessage调用时“卡住”(是的,SendMessage有一个消息泵,但是SendMessage调用之后发生的任何事情都不会运行)。如果a也这样做,而B不处理消息,那么他们都会被困在运行消息循环中,永远无法完成他们启动的过程。又名:死锁。