Моя компания создала несколько COM-объектов, и они с удовольствием использовали их из .NET. Но теперь наш клиент хочет перейти на Java. Я подумал, что было бы интересно использовать JACOB или j-interop (я не уверен, какая из них) для некоторых задач, но полученный код довольно неуправляем. Поэтому я хочу написать инструмент, который может читать TypeLib библиотеки COM, а затем генерировать классы-оболочки Java для сокрытия всего этого неуправляемого кода.
Я новичок в мире COM, поэтому я не знаю, как получить информацию об интерфейсах, методах и параметрах, которые описывают COM-объект. Я читал о чем-то, что называется TypeLib, но я не знаю, как это читать. Как я могу получить информацию из этого?
Официальный API доступен здесь: Тип Описание Интерфейсы.
Вы можете использовать его непосредственно из C ++, но я предлагаю вам использовать .NET (C # в моем примере) с дополнительным инструментом, написанным Microsoft давным-давно (мой датирован 1997 годом), который называется TLBINF32.DLL. Это также COM-объект, но совместимый с Automation (VBScript, Javascript, VB / VBA) и .NET.
Вы можете найти TLBINF32.DLL для поиска в Google (эта ссылка, кажется, работает сегодня: скачать tlbinf32.dll, убедитесь, что вы получили файл .ZIP, а не то, что они называют «фиксатором» …). Обратите внимание, что это 32-битная DLL, поэтому ваша программа должна быть скомпилирована как 32-битная, чтобы иметь возможность ее использовать. Я не знаю ни одной 64-битной версии.
Как использовать эту библиотеку, подробно объясняется в статье журнала MSDN за декабрь 2000 года: Проверка COM-компонентов с помощью библиотеки информационных объектов TypeLib. Он ориентирован на VB (не .NET), но его довольно легко перевести на .NET.
Вот пример консольного приложения на C #, которое просто выгружает всю информацию о типах из типа lib (здесь MSHTML.TLB):
class Program
{
static void Main(string[] args)
{
TypeLibInfo tli = new TypeLibInfo();
tli.ContainingFile = @"c:\windows\system32\mshtml.tlb";
foreach (TypeInfo ti in tli.TypeInfos)
{
Console.WriteLine(ti.Name);
// etc...
}
}
}