У нас есть внешнее COM-приложение, написанное на C ++, которое реализует сетевой протокол. Когда пакет данных получен, в приложение, которое зарегистрировало пакет, вызывается обратный вызов.
Интерфейс обратного вызова определяется следующим образом:
[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.
Первый вопрос: что, черт возьми, означает «%» в «буфере со знаком char%»?
Второй вопрос: я могу установить точку останова и увидеть, что вызывается обратный вызов. Я могу посмотреть на аргумент «буфер» в отладчике памяти, и он содержит данные, которые я ожидаю. Мне ОЧЕНЬ не удалось вытащить эти данные и поместить их в переменную «msg». Я знаю, что не могу выполнить приведение, как в C ++, но каждый пример, который я пробовал (в основном InteropServices :: Marshal и некоторые вещи с pin_ptr), похоже, никуда не денется.
SomeStructure объявляется в заголовочном файле и включается в приложение C ++ и C ++ / CLI SomeStructure содержит 2 беззнаковых шорта, за которыми следуют массивы из трех символов.
Будем весьма благодарны за любые указания о том, куда идти отсюда.