Как сделать обратный вызов COM в C ++ / CLI - PullRequest
0 голосов
/ 07 декабря 2011

У нас есть внешнее 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 беззнаковых шорта, за которыми следуют массивы из трех символов.

Будем весьма благодарны за любые указания о том, куда идти отсюда.

1 Ответ

0 голосов
/ 09 декабря 2011

Хорошо. Он просто «щелкнул» ... Так что я отвечу на свой вопрос здесь.

Первый вопрос: что, черт возьми, означает «%» в «буфере со знаком char%»?

«%» означает «отслеженный» и будет собирать мусор, или, по крайней мере, я так думаю:)

Второй вопрос: как маршал.

Сначала мне нужно было добраться до «внутреннего указателя», и C ++ / CLI предоставляет для этого оператор &. Тогда я смог просто запоминать данные.

pin_ptr<signed char> p = &buffer;

MaintenanceMsgs::maintenance_event_message msg;
memcpy((void*)&msg, (void*)p, sizeof(msg));

myHandler->HandleMaintenanceEvent(&msg);

Это безопасно?

...