【问题标题】:How to Marcshal a COM callback in C++/CLI如何在 C++/CLI 中编组 COM 回调
【发布时间】:2011-12-09 05:29:36
【问题描述】:

我们有一个用 C++ 编写的进程外 COM 应用程序,它实现了网络协议。当接收到一个数据包时,一个回调会被调用到为该数据包注册的应用程序中。

回调接口定义如下:

[helpstring("method MessageHandler")] HRESULT MessageHandler([in,size_is(nSize)] char * szBuf, int nSize, DWORD dwTransCode, DWORD dwSenderID, BSTR bstrFromIP);

在 C++ 中使用它不是问题。我们现在有一个需要接收回调的 C++/CLI 应用程序的案例。在破解直到编译器满意后,我得到了以下实现:

ref class MessageHandlerClass : public MessageRouterCallback
    {
    public:
        virtual void MessageHandler(signed char %buffer, int size, unsigned int msgId, unsigned int fromId, System::String^ fromIp)
        {
            switch (msgId)
            {
            case MaintenanceMsgs::maintenance_event_message::ID:
                {
                    SomeStructure msg;
                    myHandler->HandleMaintenanceEvent(&msg);
                }
            }
        }

这是我第一次涉足 C++/CLI。

第一个问题:他们在 'signed char %buffer' 中的 '%' 到底是什么意思?

第二个问题:我可以放置一个断点并查看回调是否被调用。我可以查看内存调试器中的“缓冲区”参数,它包含我期望的数据。我在提取数据并将其放入变量“msg”方面非常不成功。我知道我不能像在 C++ 中那样进行强制转换,但是我尝试过的每个示例(主要是 InteropServices::Marshal 和一些 pin_ptr 的东西)似乎都没有让我有任何收获。

SomeStructure 在头文件中声明,并包含在 C++ 和 C++/CLI 应用程序中。 SomeStructure 包含 2 个无符号短裤,后跟三个字符数组。

任何关于从这里去哪里的方向都将不胜感激。

【问题讨论】:

    标签: com callback c++-cli


    【解决方案1】:

    好的。它只是“点击”......所以我会在这里回答我自己的问题。

    第一个问题:他们在 'signed char %buffer' 中的 '%' 到底是什么意思?

    “%”只是意味着它的“跟踪”并且将被垃圾收集,或者至少我认为它是这个意思:)

    第二个问题:如何编组。

    首先我必须找到“内部指针”,C++/CLI 为此提供了 & 运算符。然后我就可以简单地记忆数据了。

    pin_ptr<signed char> p = &buffer;
    
    MaintenanceMsgs::maintenance_event_message msg;
    memcpy((void*)&msg, (void*)p, sizeof(msg));
    
    myHandler->HandleMaintenanceEvent(&msg);
    

    这样安全吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2013-04-29
      • 2013-02-02
      相关资源
      最近更新 更多