Проблема загрузки DLL-библиотеки COM-объектов - PullRequest
1 голос
/ 18 ноября 2010

Я работаю над библиотекой Qt, которая используется как плагин для большого приложения. Эта DLL зависит от других DLL, которые, к сожалению, не находятся в той же папке и, следовательно, будут загружаться только в том случае, если текущий рабочий каталог был установлен правильно (что большое приложение делает до вызова LoadLibrary в DLL). Я не могу контролировать это поведение.

Меня попросили добавить простой COM-объект к этому плагину, что я и сделал, но теперь у меня проблема в том, что DLL не может быть зарегистрирована или использована сторонним приложением, если текущий рабочий каталог не установлен правильно - потому что любые LoadLibrary вызовы плагина завершаются ошибкой из-за отсутствия зависимостей. Очевидно, что я не могу контролировать текущий рабочий каталог, используемый сторонними приложениями, и на этом этапе мне не разрешено изменять PATH, чтобы обеспечить возможность обнаружения зависимостей.

Я пытался использовать /DELAYLOAD для зависимых библиотек DLL, но это не удается из-за ошибки «не может задержать загрузку foo.dll из-за импорта символа данных ...». Опять же, я не могу легко изменить способ использования этих зависимых DLL.

В настоящее время я думаю, что единственное решение состоит в том, чтобы переместить COM-объект в автономную DLL, которая не зависит ни от чего, но я вынужден найти решение и оставить COM-объект в DLL-модуле плагина. Я не вижу, как это возможно, поэтому я подумал, увижу ли у кого-нибудь еще какие-либо идеи. Может помочь некоторая форма общесистемного вызова SetDllDirectory или некоторый взлом реестра, который может установить рабочий каталог, когда стороннее приложение вызывает LoadLibrary для моего плагина.

Ответы [ 3 ]

1 голос
/ 18 ноября 2010

IMO, разделяющий COM-объект на отдельный .dll, является самым чистым решением - любой может ожидать, что внутрипроцессный COM-сервер будет зарегистрирован с использованием regsvr32, и для этого не требуются причудливые зависимости в этом COM-сервере.

0 голосов
/ 18 ноября 2010

Вы можете использовать модель регистрации во время выполнения.Dll может зарегистрироваться в качестве COM-сервера в своем собственном коде инициализации.

Для этого требуется только, чтобы гарантированно вызывался loadlibrary перед использованием dll в качестве COM-сервера.

0 голосов
/ 18 ноября 2010

Я не знаю, является ли это именно решением вашей проблемы, но, возможно, это поможет вам: попробуйте взглянуть на возможности, предлагаемые файлами манифеста. Я надеюсь, что это поможет.

...