2009-10-22 2 views
1

Я работаю в библиотеке с открытым исходным кодом 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-файла?

+0

Является ли объектом COM вы заменяете графический элемент управления (элемент управления ActiveX) или бизнес-объект? Если это графический элемент управления, необходима другая регистрация, необходимая выше обычного COM-объекта. Если это активный элемент управления x, я буду копать на codeproject, чтобы найти статью, которую мы использовали для моей работы для этого. –

+0

Я уже понял, как сделать эту работу. Вы можете увидеть мой блог для учебника: jonathanpeppers.com – jonathanpeppers

+0

Можете ли вы поделиться им? Я не могу найти что-либо на вашей странице. –

ответ

3

Пара комментариев: во-первых, VB6 не использует CoCreateInstance для «локальных» классов, то есть классов из одного и того же проекта - он вызывает «конструктор» напрямую. Во-вторых, вам нужно подключить CoCreateInstance в разделе импорта каждого dll/ocx, из которого может быть обработан CLSID.

Лучше всего зарегистрировать «обновленный» COM-компонент с тем же CLOSID CLOSID. Таким образом, это будет автоматически использоваться клиентским приложением.

Редактировать: Или взгляните на функцию CoTreatAsClass.

+0

Мы попытались просто написать COM-компонент C# с тем же CLSID и ProgID, что и приложение vb6, но по какой-то причине оно не работает. Этот вопрос действительно является планом B, так как я не нашел хорошего примера прямой замены файла ocx на C# dll. Я поставлю редактирование для ссылки на мой старый вопрос. – jonathanpeppers

+0

Кроме того, я хотел бы прокомментировать, что EasyHook перехватывает все вызовы функции внутри процесса - независимо от того, сколько DLL или модулей загружено. – jonathanpeppers

+0

Моя точка зрения: COM dlls/ocxes загружаются «динамически», поэтому их часть импорта должна «исправляться» во время процесса. Это не одна задача, которую вы делаете заранее. Но вы или EasyHook, вероятно, уже позаботились об этом. – wqw

1

Если у вас есть исходный код для исходного компонента, очевидно, VBMigration Partner can upgrade a VB6 COM component to a VB.Net component that has binary compatibility with the original VB6 component. Я не знаю, поддерживает ли он OCX.

+0

Похоже, что этот инструмент использует исходный код и выплевывает исходный код. У меня не будет инструмента, который мог бы скомпилировать VB6 на VB.Net, VB6, декомпилированный, в лучшем случае выходит на ассемблер. – jonathanpeppers

+1

@Jonathan: true, я предполагаю, что исходный код доступен. Может быть, это слишком оптимистично. – MarkJ

+0

OCX = ActiveX control DLL с расширением, переименованным в OCX. Они функционально одинаковы. (Однако сборки .net имеют больше в них, даже если они экспортируют элементы управления activex.) –

Смежные вопросы