Я работаю в библиотеке с открытым исходным кодом EasyHook.C# - EasyHook CoCreateInstance
Что я пытаюсь сделать, подключается, когда приложение VB6 вызывает CoCreateInstance из ole32.dll на конкретном CLSID, возвращает мою собственную реализацию C# для объекта, а не истинный COM-объект. Моя реализация C# происходит из того же интерфейса, который tlbimp.exe выплескивает для COM-объекта, который я хочу заменить.
Мой крюк работает, и я могу подключиться к вызовам, записывать данные о вызове, а затем p/invoke CoCreateInstance из C#, чтобы приложение VB6 запускалось как обычно.
Я замечаю, что COM-объект, который я хочу заменить, не проходит через мой крючок.
Кто-нибудь знает, как VB6 загружает файлы ocx под капот? Могу ли я подключиться к собственно абонентскому апи-вызову?
Или это то, что я пытаюсь сделать невозможным из-за природы .Net?
ОБНОВЛЕНИЕ: альтернативное решение состоит в том, чтобы написать COM-объект для замены старого, но мы не можем заставить его работать. Вот старое сообщение, которое я закрыл на эту тему: Replace COM object
ОБНОВЛЕНИЕ: После дальнейшего осмотра мы можем regsvr32/u старый файл ocx и использовать regasm для регистрации нашей .ll dll. Мы помещаем MessageBox в конструктор нашего COM-объекта, и приложение VB6 загружает и выдает этот флажок, но он сбой, как только он вызывает первый вызов метода для объекта.
Я подозреваю, что у нас есть некоторые сигнатуры методов, мы также используем то, что tlbimp.exe дал нам, когда мы запустили его на целевом ocx, который мы хотим заменить. Возможно ли, что tlbimp вносит изменения в сигнатуры, которые препятствуют загрузке нашей сборки приложениям VB6?
Например, иногда COM подпись будет выглядеть следующим образом:
HRESULT MyMethod(IUnknown* ppv);
И tlbimp.exe даст C# что-то вроде:
IUnknown MyMethod();
который выглядит гораздо чище на C# разработчика. Кто-нибудь знает об этом или хорошую статью, которая могла бы объяснить, как написать «двоичную совместимую» сборку COM из C# для замены ocx-файла?
Является ли объектом COM вы заменяете графический элемент управления (элемент управления ActiveX) или бизнес-объект? Если это графический элемент управления, необходима другая регистрация, необходимая выше обычного COM-объекта. Если это активный элемент управления x, я буду копать на codeproject, чтобы найти статью, которую мы использовали для моей работы для этого. –
Я уже понял, как сделать эту работу. Вы можете увидеть мой блог для учебника: jonathanpeppers.com – jonathanpeppers
Можете ли вы поделиться им? Я не могу найти что-либо на вашей странице. –