接收端收不到 SendMessage发送的消息

使用C#的 SendMessage 发送消息给另一个进程, 如下:

 

public const int WM_COPYDATA = 0x004A;
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
    public int Reserved;
    public int Length;
    public int pData;
}
#region 打包数据结构
IntPtr pAgr = Marshal.AllocHGlobal(szData.Length);
Marshal.Copy(szData, 0, pAgr, szData.Length);

COPYDATASTRUCT cds;
cds.Length = szData.Length;
cds.Reserved = IntPtr.Zero;
cds.pData = (int)pAgr;

IntPtr pcbData = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
Marshal.StructureToPtr(cds, pcbData, false);
#endregion

 
SendMessage((int)HWND, (uint)WM_COPYDATA, (int)WndHandle, (int)pcbData);

接收端死活都收不到数据, 百思不得其解, 后来实在没有办法, 修改了一下 COPYDATASTRUCT的定义为:
</pre><pre code_snippet_id="1820860" snippet_file_name="blog_20160810_6_9918410" name="code" class="csharp">[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
	public IntPtr Reserved;
	public int Length;
	public IntPtr pData;
}


 
居然就可以了...无语. 不明白是什么问题. 先用着先.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C 语言中,可以使用 iceproxy 库来实现一个 publisher 发布消息,多个 subscriber 接收消息的程序。 首先需要定义一个消息结构体,用于存储待发送的数据。然后,在 publisher ,使用 iceproxy 库提供的 API 把消息结构体发布到消息队列中。在 subscriber ,使用 iceproxy 库提供的 API 订阅消息队列,从而能够接收到 publisher 发布的消息。 以下是一个简单的示例代码: ``` #include <iceproxy/iceproxy.h> struct Message { int data; }; int main() { // 初始化 iceproxy iceproxy_init(); // 定义 publisher iceproxy_publisher_t publisher = iceproxy_publisher_init("queue_name"); // 定义 subscriber iceproxy_subscriber_t subscriber = iceproxy_subscriber_init("queue_name"); // publisher 发送消息 Message message = {10}; iceproxy_publisher_send(publisher, &message, sizeof(message)); // subscriber 接收消息 Message received_message; iceproxy_subscriber_receive(subscriber, &received_message, sizeof(received_message)); // 打印接收到的消息 printf("Received message: %d\n", received_message.data); // 释放 iceproxy 资源 iceproxy_publisher_destroy(publisher); iceproxy_subscriber_destroy(subscriber); iceproxy_cleanup(); return 0; } ``` 注意:这仅是一个示例代码,在实际使用中可能需要根据具体需求进行调整和完善。 ### 回答2: 使用IceProxy编写一个发布者(publisher)发送消息给多个订阅者(subscriber)接收的程序可以按照以下步骤进行: 1. 首先,在IceProxy中定义一个发布者接口(Publisher)和一个订阅者接口(Subscriber)。这两个接口可以定义在一个ice文件中。 2. 在发布者接口(Publisher)中定义一个发送消息的方法(sendMessage),该方法可以将消息发送给所有订阅者。在该方法中,可以使用IceProxy获取所有订阅者的代理对象,并将消息发送给它们。 3. 在订阅者接口(Subscriber)中定义一个接收消息的方法(receiveMessage),用于接收发布者发送消息。 4. 实现发布者(Publisher)和订阅者(Subscriber)接口的类。在发布者的类中,可以使用IceProxy获取所有订阅者的代理对象,并在发送消息时调用它们的接收消息方法。在订阅者的类中,实现接收消息的方法,可以将接收到的消息输出到控制台或者其他操作。 5. 在main函数中,创建一个发布者的代理对象和多个订阅者的代理对象,并将这些代理对象传递给发布者和订阅者的类。 6. 在main函数中,调用发布者的发送消息方法,向所有订阅者发送消息。 7. 运行程序,可以看到所有订阅者都能够接收到发布者发送消息。 总的来说,通过定义发布者接口和订阅者接口,在发布者中获取所有订阅者的代理对象,并在发送消息时调用接收消息方法,可以实现发布者发送消息给多个订阅者接收的程序。同时,使用IceProxy可以简化代理对象的创建和通信过程。 ### 回答3: 为了实现这个功能,我们首先需要了解一下IceProxy和Publisher/Subscriber模式。 IceProxy是一种可以将客户与服务相互连接的中间件技术。它可以帮助我们轻松地创建分布式应用程序,而不需要关注底层网络通信的细节。 Publisher/Subscriber模式是一种常见的消息传递模式,其中一个或多个发布者(Publisher)发送消息到一个或多个订阅者(Subscriber),订阅者接收并处理这些消息。 下面是一个使用IceProxy编写的Publisher发送,多个Subscriber接收的程序示例: 首先,我们需要定义一个消息接口,例如Message.ice: ``` module Tutorial { interface Message { void sendMessage(string msg); }; }; ``` 然后,我们可以使用Slice编译器生成相应的代码,创建一个发布者(Publisher)和多个订阅者(Subscriber)类: ``` slice2cpp Message.ice // 生成C++的代码 slice2py Message.ice // 生成Python的代码 ``` 接下来,我们可以编写一个PublishServer.cpp的服务器程序来实现发布者(Publisher): ```cpp #include <Ice/Ice.h> #include <Message.h> using namespace std; class PublishServer : public Tutorial::Message { public: virtual void sendMessage(const string& msg, const Ice::Current&) { // 发送消息到所有订阅者 // ... } }; int main(int argc, char* argv[]) { int status = 0; try { Ice::CommunicatorPtr ic = Ice::initialize(argc, argv); Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("PublishAdapter", "tcp -p 10000"); Ice::ObjectPtr object = new PublishServer(); adapter->add(object, ic->stringToIdentity("PublishServer")); adapter->activate(); ic->waitForShutdown(); } catch (const Ice::Exception& e) { cerr << e << endl; status = 1; } catch (const char* msg) { cerr << msg << endl; status = 1; } return status; } ``` 然后,我们可以编写多个Subscriber.cpp的客户程序来实现订阅者(Subscriber): ```cpp #include <Ice/Ice.h> #include <Message.h> using namespace std; class Subscriber : public Tutorial::Message { public: virtual void sendMessage(const string& msg, const Ice::Current&) { // 处理接收到的消息 // ... } }; int main(int argc, char* argv[]) { int status = 0; try { Ice::CommunicatorPtr ic = Ice::initialize(argc, argv); Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("SubscriberAdapter", "tcp -p 10001"); Ice::ObjectPtr object = new Subscriber(); adapter->add(object, ic->stringToIdentity("Subscriber")); adapter->activate(); ic->waitForShutdown(); } catch (const Ice::Exception& e) { cerr << e << endl; status = 1; } catch (const char* msg) { cerr << msg << endl; status = 1; } return status; } ``` 最后,我们需要编译和运行发布者和订阅者程序,可以使用以下命令: ``` g++ PublishServer.cpp -o PublishServer -lIce -lIceUtil g++ Subscriber.cpp -o Subscriber -lIce -lIceUtil ``` 运行PublishServer: ``` ./PublishServer ``` 然后分别运行多个Subscriber: ``` ./Subscriber ``` 这样就实现了一个使用IceProxy编写的Publisher发送,多个Subscriber接收的程序。当PublishServer发送消息时,Subscriber会接收并处理这些消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值