Внедрение ресурсов библиотеки типов COM (TLB) в встроенную в MinGW DLL

У меня есть библиотека типов 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 ,

  • Правильный ли мой ресурсный скрипт («myres.rc»)?
  • Какие другие инструменты ресурсов я могу использовать, чтобы проверить, попал ли 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?

0

Решение

Проблема в том, что компоновщик MinGW может обрабатывать только один объектный файл, содержащий ресурсы. Он забирает ресурсы у первого и игнорирует все остальные.

Итак, я делал:

$ g++ -o mylib.dll -shared main_resources.o myres.o

где «myres.o» содержит TLB. Если я инвертирую порядок объектов в командной строке, DLL будет содержать TLB и ни один из других ресурсов. Кроме этого, мой код в разделе вопросов работает нормально.

Увидеть:

0

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

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

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