【发布时间】: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 个无符号短裤,后跟三个字符数组。
任何关于从这里去哪里的方向都将不胜感激。
【问题讨论】: