Как стать автором
Обновить

Комментарии 17

По колбэкам чуть позже обновлю статью.
так-то можно и без IDL обойтись, т.к. C#-ые COM прокси реализуют IDispatch, если мне не изменяет память. И при чем там IDA, если это обычный COM ?)

А можно пример?


Про иду в статье исключительно как про плюсовый клиент для ком.

пример, чего? Как в C/C++ вызвать IDispatch метод? Так в гугле их тысячи. Как регить COM класс C# — так regasm и его друзья. Кроме того в C++ проще использовать #import (если речь про MS VC), нежели idl (который опять же — из regasm-а)… Короче почитайте книжку какую про COM и C# (второй версии — т.к. потом тема «угасла»), ну и в MSDN всё как бы было написано.

У меня TLB не импортировался, а ошибки никакие не выводило. Пришлось конвертить руками, заодно видно сразу, чего нет, и что есть.


По поводу тысяч — неправда. Регистрировать через шарп я как раз таки умею. А вот регистрировать из шарпа, чтобы, например, те же колбэки протаскивать из плюсов в Шарп — бедная тема. Можно об этом хотя бы один линк?

У меня TLB не импортировался, а ошибки никакие не выводило
так может стОило разобраться сначала с этим? Ну там, например, уровень логирования msbuild-а крутануть и т.д. А не «забыть как страшный сон»…

«По поводу тысяч — неправда.», да бросьте, даже в MSDN есть раздел, включающий и IDispatch (хотя ничего в нём такого нет для тех, кто когда-нибудь писал ActiveX сервера, аналогично в ATL были примеры, и даже в поставку WinSDK всё это так или иначе входило, в примерах).

Мне лично лень ворошить относительный труп (ActiveX и т.п., плюс MS тоже не рекомендует), да и вам не советую — уж сложностей в IPC с современными фреймворками типа grpc нет же, так спросите себя «оно вам надо» идти этой дорогой?

Note: вы также можете не регить com сервер в реестре, возможно вписать его через manifest (SxS манифест) файл…
Только зачем мне ActiveX?
Мне нужно просто пробросить плюсовый колбэк в COM out-of-process написанный на шарпе.

Общепринято функции обратного вызова в COM (события) используют интерфейс IConnectionPoint, смотрите в этом направлении. Издатель событий публикует общедоступный интерфейс, который реализуют подписчики. Затем получатели событий запрашивают у сервера экземпляр IConnectionPoint, передают туда объект, унаследованный от общедоступного интерфейса. Теперь сервер может вызывать функции общедоступного интерфейса, что равно вызову функции на стороне клиента.


В случае если клиент и сервер находятся в разных исполняемых файлах, то общедоступный интерфейс события проще унаследовать от IDispatch, чтобы не возиться с прокси‐заглушками.

Тема интересная, правда статья как-то внезапно закончилась. Думал, что дальше будет что-нибудь про динамическую диспетчеризацию и IDispatch. Еще COM интересен тем, что это чуть ли не единственный способ сохранять бинарную совместимость библиотеки в C++. Жаль, что технология закапывается а альтернатив нет.
Было бы круто, если бы об этом кто-то рассказал в виде самостоятельной статьи. Моих знаний на это пока не хватает.
Возможно вы рано отбросили идею:
1) Сделать LoadLibrary(«emu_core.dll»), затем GetProcAddress(core, «Pause») и pause()

В emu_core.dll можно был бы сделать раздел с атрибутом SHARED. Тогда все данные в этом разделе разделялись бы между процессом IDA и процессом вашего GUI. Не много примитивов синхронизации и было бы вам бесплатное счастье.
За подробностями стоит обратиться к классическому труду Джеффри Рихтера «Windows via С/С++» — глава 17

Это какой-то прикол? Во все пдфках нет 17-й главы. 16 и за ней сразу 18.

Нашлось в русской версии:). Спасибо!

Только колбэки конечно, останутся проблемой. Но дллку хотя бы можно будет использовать как shared memory.

В чем именно проблема? Какая у вас архитектура с этими колбэки вкратце, кто кого вызывает?

Ядро эмулятора вызывает колбэки гуи эмулятора, которые тот ему добавил, отправляя информацию о наступивших обытиях: брейкпоинт, шаг, пауза, ресет и т.п.

Побаловался с этим. Тема интересная. Единственное, что если используются всякие там указатели (asterisk, unique_ptr, shared_ptr и т.п.), становится невозможной работа с ними, т.к. эмулятор инициализирует их своими указателями, а мне достаются уже проинициализированные. Ну, это и логично. Т.е. возможна только работа с полноценными данными, но никак не указателями на них.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории