We have an out of process COM application that was written in C++ that implements are networking protocol. When a packet of data is received a callback is invoked into the application that registered for the packet.
The callback interface is defined as such:
[helpstring("method MessageHandler")] HRESULT MessageHandler([in,size_is(nSize)] char * szBuf, int nSize, DWORD dwTransCode, DWORD dwSenderID, BSTR bstrFromIP);
Using this in C++ has not been an issue. We now have a case where we have a C++/CLI application that needs to receive callbacks. After hacking away until the compiler was happy, I arrived at the following implementation:
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);
}
}
}
This is my first foray into C++/CLI.
First Question: What they heck does ‘%’ mean in ‘signed char %buffer’?
Second Question: I can place a breakpoint and see that the callback is getting called. I can look at the ‘buffer’ argument in the memory debugger and it contains the data I expect. I have been VERY unsuccessful at pulling that data out and placing it into the variable ‘msg’. I know I can’t do a cast like in C++, but every example I’ve been tried (Mostly InteropServices::Marshal and some pin_ptr stuff) doesn’t seem to get me anywhere.
SomeStructure is declared in a header file and is included by both the C++ and the C++/CLI application. SomeStructure contains 2 unsigned shorts followed by three character arrays.
Any direction on where to go from here would be greatly appreciated.
Ok. It just ‘clicked’… So I’ll answer my own question here.
The ‘%’ just means its ‘tracked’ and will be garbage collected, or at least that’s what I think it means 🙂
First I had to get to the ‘internal pointer’ and C++/CLI provides the & operator for that. Then I was able to simply memcpy the data over.
Is this safe?