У меня есть библиотека типов COM, созданная с midl
Назовите это «mylib.tlb». Я хочу встроить его в DLL, «mylib.dll», которая скомпилирована и связана с MinGW. DLL «mylib.dll» также содержит функцию myfunc()
, Я хочу иметь возможность встраивать «mylib.tlb» в качестве ресурса в «mylib.dll», чтобы myfunc()
— который также находится в «mylib.dll» — можно загрузить «mylib.tlb» с помощью функции COM LoadTypeLibEx()
,
Другими словами:
void myfunc() // a function living within "mylib.dll"{
// ...
ITypeLib * result(0);
HRESULT hr = LoadTypeLibEx(path_to_this_dll, REGKIND_NONE, &result);
// should successfully load "mylib.tlb" into result!!!
}
Это не работает для меня, и я не уверен, почему. LoadTypeLibEx()
возвращается -2147312566 = 0x80029c4a = TYPE_E_CANTLOADLIBRARY
, Я не могу сказать, если это потому, что он не может загрузить DLL вообще, или если он не может найти библиотеку типов в DLL. Я подтвердил, что мой path_to_this_dll
переменная содержит путь к «mylib.dll», поэтому я надеюсь, что это последнее.
Я пытаюсь встроить mylib.tlb в mylib.dll, используя следующую командную строку инструмента MinGW:
$ windres myres.rc myres.o
$ ar rcs mylib.a a.o b.o ... myres.o ... x.o
$ g++ -o mylib.dll -shared ... mylib.a ...
Где «myres.rc» просто выглядит так:
1000 typelib "mylib.tlb"
Когда я собираю «mylib.dll», я могу проверить, что он содержит кучу других ресурсов (значки, курсоры и т. Д.), Используя программу под названием ResourceHacker, но я не могу сказать от ResourceHacker, превратил ли TLB это в DLL ,
РЕДАКТИРОВАТЬЯ заметил, что файл TLB содержит строку «MIDL», поэтому я попытался найти это в различных файлах. Каким-то образом ресурс библиотеки типов не попадает в DLL:
$ grep MIDL mylib.tlb
Binary file mylib.tlb matches
$ grep MIDL myres.o
Binary file myres.o matches
$ grep MIDL mylib.a
Binary file mylib.a matches
$ grep MIDL mylib.dll
$ echo $?
1
Почему компоновщик не поместит ресурс TLB в DLL?
Проблема в том, что компоновщик MinGW может обрабатывать только один объектный файл, содержащий ресурсы. Он забирает ресурсы у первого и игнорирует все остальные.
Итак, я делал:
$ g++ -o mylib.dll -shared main_resources.o myres.o
где «myres.o» содержит TLB. Если я инвертирую порядок объектов в командной строке, DLL будет содержать TLB и ни один из других ресурсов. Кроме этого, мой код в разделе вопросов работает нормально.
Увидеть:
Других решений пока нет …