2010-11-18 2 views
1

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

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

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

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

ответ

1

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

+0

FWIW Я полностью согласен. Мне просто нужно продать эту идею властям. – Rob

+0

@Rob: Разве силы не видят то количество боли, которое приносит дизайн? – sharptooth

0

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

0

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

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