我们有一个用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个无符号短路,后跟三个字符数组。
非常感谢任何从这里出发的方向。
答案 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);
这样安全吗?