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