Вызвать функцию dll в NSIS и вернуть логическое значение - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался вызвать функцию в моей DLL, но это не удалось.Вот мой скрипт NSIS:

!include "LogicLib.nsh"
Section "MyTest"
Strcpy $0 "abc"
System::Call 'MyDll::FindSomething(t, b) i(r0, false) .r1'

${If} $1 == true
    MessageBox MB_OK "1"
${ElseIf} $1 == false
    MessageBox MB_OK "0"
${EndIf}
SectionEnd

Функция FindSomething должна возвращать логическое значение true или false.Результат моего скрипта ничего не показывает после выполнения.

1 Ответ

0 голосов
/ 26 февраля 2019
  • Вы не извлекаете MyDll.dll?

  • false - это не поддерживаемое ключевое слово, используйте 0.

Без декларации C / C ++ сложно привести полный пример, но я могу попробовать:

Section
InitPluginsDir
File "/oname=$PluginsDir\MyDll.dll" "c:\myfiles\MyDll.dll" ; Extract

System::Call 'KERNEL32::AddDllDirectory(w "$PluginsDir")' ; Make sure we are allowed to load from here

System::Call 'KERNEL32::LoadLibrary(t "$PluginsDir\MyDll.dll")p.r9'
MessageBox mb_OK "Loaded MyDll at address $9" ; This should not be 0!

; bool __cdecl FindSomething1(char* p1, bool p2):
StrCpy $0 "abc"
System::Call 'MyDll::FindSomething1(m r0, b 0)b.r1 ?c'
MessageBox mb_OK "Returned $1"

; int WINAPI FindSomething2(LPTSTR p1, BOOL p2):
StrCpy $0 "abc"
System::Call 'MyDll::FindSomething2(t r0, i 0)i.r1'
MessageBox mb_OK "Returned $1"
; ${If} $1 <> 0 ...

System::Call 'KERNEL32::FreeLibrary(p r9)'
SectionEnd

Только самые последние версии системного плагина поддерживают тип b, нов любом случае вы можете просто использовать i в большинстве мест.

...