如何在C ++ / CLI中对COM回调进行Marcshal

时间:2011-12-07 17:15:55

标签: com callback c++-cli

我们有一个用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'中'%'是什么意思?

第二个问题:我可以放置一个断点,看看回调是否被调用。我可以查看内存调试器中的'buffer'参数,它包含我期望的数据。我已经非常不成功地将数据拉出并将其放入变量'msg'中。我知道我不能像C ++那样进行演员表,但是我所尝试过的每个例子(主要是InteropServices :: Marshal和一些pin_ptr的东西)似乎都没有让我感到满意。

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

非常感谢任何从这里出发的方向。

1 个答案:

答案 0 :(得分:0)

确定。它只是点击了......所以我会在这里回答我自己的问题。

  

第一个问题:他们到底做了什么'%'表示签名的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);

这样安全吗?