Как я могу вызвать DLL, которая импортирует другую DLL с помощью системного плагина NSIS

Я новичок в установщике NSIS. Я должен сказать, что развертывание NSIS - это круто. но в последнее время я столкнулся с проблемой.

Я использую скрипт NSIS для вызова, скажем, A.dll, который скомпилирован с использованием Visual C++ и экспортирует некоторые функции Си. и A.dll импортируют B.dll. Поэтому я извлекаю их (A.dll и B.dll) в $PLUGINSDIR в самом начале установки.

После этого я вызываю System::call для вызова, скажем, "test()" A.dll. но это всегда возвращает "ошибку". Я также сделал тест, удаляющий импорт B.dll, и "test()" работает и возвращает значение, которое я ожидал.

вот код:

;extract dll file

InitPluginsDir

SetOutPath $PLUGINSDIR

File "A.dll"

File "B.dll"

...........

;call it
code:
System::Call "$PLUGINSDIR\A::test() i.r0"

$ 0 возвращает "ошибку"

после удаления импорта B.dll и повторной компиляции A.dll. test() работает нормально.

Кто-нибудь может объяснить, Как я могу вызвать DLL, которая импортирует другую DLL, используя системный плагин NSIS? Заранее спасибо. извините за плохой английский. надеюсь, вы, ребята, понимаете, о чем я.

1 ответ

Загрузчик не может найти B.dll, поэтому LoadLibrary (называемая system.dll) на A.dll не будет работать.

Вы можете установить рабочий каталог:

Push $outdir ; Save current, not required
SetOutPath $pluginsdir
System::Call "$PLUGINSDIR\A::test() i.r0"
pop $outdir
SetOutPath $outdir ; Restore

или вы можете загрузить B.dll самостоятельно:

System::Call 'KERNEL32::LoadLibrary(t "$PLUGINSDIR\B.dll")i.s'
System::Call "$PLUGINSDIR\A::test() i.r0"
System::Call 'KERNEL32::FreeLibrary(is)'
Другие вопросы по тегам