Я работаю над библиотекой Qt, которая используется как плагин для большого приложения. Эта DLL зависит от других DLL, которые, к сожалению, не находятся в той же папке и, следовательно, будут загружаться только в том случае, если текущий рабочий каталог был установлен правильно (что большое приложение делает до вызова LoadLibrary
в DLL). Я не могу контролировать это поведение.
Меня попросили добавить простой COM-объект к этому плагину, что я и сделал, но теперь у меня проблема в том, что DLL не может быть зарегистрирована или использована сторонним приложением, если текущий рабочий каталог не установлен правильно - потому что любые LoadLibrary
вызовы плагина завершаются ошибкой из-за отсутствия зависимостей. Очевидно, что я не могу контролировать текущий рабочий каталог, используемый сторонними приложениями, и на этом этапе мне не разрешено изменять PATH, чтобы обеспечить возможность обнаружения зависимостей.
Я пытался использовать /DELAYLOAD
для зависимых библиотек DLL, но это не удается из-за ошибки «не может задержать загрузку foo.dll из-за импорта символа данных ...». Опять же, я не могу легко изменить способ использования этих зависимых DLL.
В настоящее время я думаю, что единственное решение состоит в том, чтобы переместить COM-объект в автономную DLL, которая не зависит ни от чего, но я вынужден найти решение и оставить COM-объект в DLL-модуле плагина. Я не вижу, как это возможно, поэтому я подумал, увижу ли у кого-нибудь еще какие-либо идеи. Может помочь некоторая форма общесистемного вызова SetDllDirectory
или некоторый взлом реестра, который может установить рабочий каталог, когда стороннее приложение вызывает LoadLibrary
для моего плагина.