NSIS系统内核32::LoadLibrary不搜索Outdir或Path

NSIS系统内核32::LoadLibrary不搜索Outdir或Path,nsis,Nsis,我正在尝试加载并调用NSIS安装程序中的C库DLL函数。当我尝试加载DLL时,会发出一个错误126(error\u MOD\u NOT\u FOUND) 这是我用来测试的最小安装程序脚本: OutFile Main.exe ShowInstDetails show Section SetOutPath "C:\Program Files (x86)\MyApp" System::Call 'kernel32::LoadLibraryA(m "C:\Program Files (x86

我正在尝试加载并调用NSIS安装程序中的C库DLL函数。当我尝试加载DLL时,会发出一个错误126(error\u MOD\u NOT\u FOUND)

这是我用来测试的最小安装程序脚本:

OutFile Main.exe

ShowInstDetails show

Section
  SetOutPath "C:\Program Files (x86)\MyApp"
  System::Call 'kernel32::LoadLibraryA(m "C:\Program Files (x86)\MyApp\API.dll")i.r0 ? e'
  Pop $9
  DetailPrint $9
  DetailPrint $0

  System::Call 'kernel32::GetProcAddress(i r0,m "GetVersion")i.r1 ? e'
  Pop $9
  DetailPrint $9
  DetailPrint $1
  System::Call 'kernel32::FreeLibrary(ir0)'
SectionEnd
您可以看到,我正在将输出路径设置为DLL所在的位置;它的所有依赖项都在哪里。但是,在procmon中检查进程时,我发现只有Windows系统目录在搜索依赖项,而不是输出路径:

Load Image             C:\Program Files (x86)\MyApp\API.dll  SUCCESS                 
CreateFile             C:\Program Files (x86)\MyApp\API.dll  SUCCESS                 
QueryBasicInformationFiC:\Program Files (x86)\MyApp\API.dll  SUCCESS                 
CloseFile              C:\Program Files (x86)\MyApp\API.dll  SUCCESS                 
CloseFile              C:\Program Files (x86)\MyApp\API.dll  SUCCESS                 
Thread Create                                                SUCCESS                 
CreateFile             C:\Windows\syswow64\DEPENDENCY_1.dll  NAME NOT FOUND          
CreateFile             C:\Windows\syswow64\msvcr100.dll      SUCCESS                 
QueryBasicInformationFiC:\Windows\syswow64\msvcr100.dll      SUCCESS                 
CloseFile              C:\Windows\syswow64\msvcr100.dll      SUCCESS                 
CreateFile             C:\Windows\syswow64\DEPENDENCY_2.dll  NAME NOT FOUND          
CreateFile             C:\Windows\syswow64\DEPENDENCY_3.dll  NAME NOT FOUND          
CreateFile             C:\Windows\syswow64\msvcr100.dll      SUCCESS                 

如何让我的输出路径被搜索以查找依赖项?应该注意的是,“C:\Program Files(x86)\MyApp”也在Path环境变量中,那么为什么不搜索它呢?

NSIS中最近的安全更改已经锁定了它允许您从中加载库的位置。您可以调用以添加其他目录:

Section
System::Call 'KERNEL32::AddDllDirectory(w "c:\path")' ; Note: Path must exist at this point
System::Call 'KERNEL32::LoadLibrary(t "c:\path\file.dll")p.r0'
System::Call 'KERNEL32::GetProcAddress(pr0, m "somefunction")p.r1'
${If} $1 P<> 0
  ...
${EndIf}
System::Call 'KERNEL32::FreeLibrary(pr0)'
SectionEnd
部分
系统::调用“KERNEL32::AddDllDirectory(w“c:\path”);注意:此时必须存在路径
系统::调用'KERNEL32::LoadLibrary(t“c:\path\file.dll”)p.r0'
系统::调用'KERNEL32::GetProcAddress(pr0,m“somefunction”)p.r1'
${If}$1 P 0
...
${EndIf}
系统::调用“内核32::自由库(pr0)”
分段结束

这可能是针对最近的NSIS版本的,但我无法确定,因为您从未告诉我们您使用的是哪个版本。另外,不要使用LoadLibraryA,请使用LoadLibrary和“t”类型!