Получение IDL (для TLB) из COM + dll, когда это не предусмотрено

У меня есть .dll, который содержит некоторые фильтры DirectShow (COM) с конкретными / пользовательскими интерфейсами для запроса.

Большинство сторонних компонентов directshow содержат встроенные файлы .tlb, которые можно использовать для взаимодействия между средами (импорт C # typelib).

Я не хотел бы пытаться вручную создавать интерфейсы, необходимые для c #, потому что не было предоставлено ни одного файла idl / tlb.

Можно ли сгенерировать tlb (или, по крайней мере, idl, который я могу скомпилировать MIDL) из COM .dll?

4

Решение

Да, есть возможность перепроектировать / разобрать 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. Вы должны будете выбрать то, что вам нужно, но, надеюсь, этого будет достаточно.

С уважением,

Лорд БаттенБерг

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]