У меня есть .dll, который содержит некоторые фильтры DirectShow (COM) с конкретными / пользовательскими интерфейсами для запроса.
Большинство сторонних компонентов directshow содержат встроенные файлы .tlb, которые можно использовать для взаимодействия между средами (импорт C # typelib).
Я не хотел бы пытаться вручную создавать интерфейсы, необходимые для c #, потому что не было предоставлено ни одного файла idl / tlb.
Можно ли сгенерировать tlb (или, по крайней мере, idl, который я могу скомпилировать MIDL) из COM .dll?
Да, есть возможность перепроектировать / разобрать IDL (или что-то очень близкое к этому). Что вам нужно сделать, это дать себе новый консольный проект C ++, который дает код по умолчанию
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
и затем вы вставляете оператор #import под оператором #include. Поэтому я играл с C # Assembly, размеченной для работы в качестве COM Interop DLL, и я назвал его ComExample2, и он живет в том же решении, что и консольный проект C ++, который я добавил, что означает, что я могу использовать хороший относительный путь. Так что мое утверждение #import выглядит так
#import "..\ComExample2\bin\Debug\ComExample2.tlb" no_namespace named_guids
Затем вы создаете консольное приложение. Если вы углубитесь в файлы, сгенерированные во время сборки, вы найдете файл, заканчивающийся на .TLH, который обозначает заголовок библиотеки типов. Так что мой путь
..\ComExample2\ConsoleApplication1\Debug\comexample2.tlh
Внутри моего файла есть что-то очень похожее на idl. Вот отредактированный фрагмент, чтобы дать вам вкус ….
struct __declspec(uuid("515b1b18-1602-4d42-b743-f1b3c458a0d0"))
/* LIBID */ __ComExample2;
struct /* coclass */ ComExampleClass2;
//
// Type library items
//
struct __declspec(uuid("713007fe-e74c-4fec-b91a-5ef8df279929"))
IFoo : IDispatch
{
//
// Wrapper methods for error-handling
//
_bstr_t Greeting ( );
long Sim (
long a,
long b );
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall raw_Greeting (
/*[out,retval]*/ BSTR * pRetVal ) = 0;
virtual HRESULT __stdcall raw_Sim (
/*[in]*/ long a,
/*[in]*/ long b,
/*[out,retval]*/ long * pRetVal ) = 0;
};
struct __declspec(uuid("efe233b5-8ab3-4414-855e-1f027e0a72d5"))
ComExampleClass2;
// interface _Object
// [ default ] interface IFoo
Все это сгенерированный код, так что вы можете легко написать скрипт C ++ для библиотеки COM. Вы должны будете выбрать то, что вам нужно, но, надеюсь, этого будет достаточно.
С уважением,
Лорд БаттенБерг
Других решений пока нет …