Добрый день коллеги-разработчики
Я искал в Интернете в течение 2 дней, как сделать то, что мне нужно, и я пробовал много образцов без успеха. Однако это не значит, что я охватила все сайты — я думаю, что я слепа на один глаз и не вижу другим.
Во всяком случае, мне вручили лист бумаги с определением COM-интерфейса автоматизации и попросили разработать приложение C# для использования интерфейса и обратных вызовов соответственно.
Итак, начнем с простого (или я так думал) - сигнатура метода С++:
STDMETHODIMP CSimpleChatServer::CallMe(BSTR clientName, BSTR** returnMessage)
и подпись интерфейса:
HRESULT _stdcall CallMe([in] BSTR clientName, [in] BSTR** helloMessage);
И мне нужно вызвать это из C# - я установил интерфейс для ISimpleChatServer; следовательно, кодовый вызов, который я пытаюсь, похож.
string rtrnMsg = string.Empty;
ImySimpleCom.CallMe("Robert", rtrnMsg)
Поскольку подпись является [in], я получаю исключение при попытке доступа к защищенной памяти.
Теперь я считаю, что он хочет, чтобы IntPtr был вторым параметром; однако все мои попытки добиться этого не увенчались успехом.
Пожалуйста, имейте в виду, что я не могу изменить библиотеку - это устаревший интерфейс "как есть", который нам нужно использовать еще некоторое время, и у провайдера нет никого, кто бы обновлял его соответствующим образом (на самом деле я думаю, что они не есть кому поработать).
Любая помощь будет приветствоваться.
С уважением, Роберт С.
ImySimpleCom
? Вы используете p/invoke или встроенные COM-функции .NET? - person Scott Chamberlain   schedule 03.11.2016BSTR**
для второго параметра, который генерирует [in] для интерфейса. - person Robert Springer   schedule 03.11.2016