Windows下Go加载依赖非系统目录DLL的问题及解决
问题描述
我尝试在Windows系统下通过Go加载库,代码如下:
citect, err := syscall.LoadDLL("C:\Program Files (x86)\AVEVA Plant SCADA\Bin\Bin (x64)CtApi.dll")问题在于该库的依赖项也位于同一目录,导致报错“找不到指定的模块”,我确定这是由于未满足其他DLL的依赖所致。请问能否通过syscall强制指定DLL搜索路径?
解决更新
之前的问题源于仅指定LOAD_LIBRARY_SEARCH_USER_DIRS,但目标库同时需要标准搜索路径。添加系统标准路径配置后,已成功获取有效的库句柄,完整代码如下:
func main() { fmt.Println("hello") dllPath := "C:\Program Files (x86)\AVEVA Plant SCADA\Bin\Bin (x64)" kernel, _ := windows.LoadDLL("kernel32.dll") defer kernel.Release() sdd, err := kernel.FindProc("SetDefaultDllDirectories") if err != nil { panic(err) } r1, _, err := sdd.Call(windows.LOAD_LIBRARY_SEARCH_SYSTEM32) if r1 == 0 { panic(err) } addd, err := kernel.FindProc("AddDllDirectory") if err != nil { panic(err) } chars := StringToWideCharPtr(dllPath) r1, _, err = addd.Call(uintptr(unsafe.Pointer(chars))) fmt.Printf("result of add dll directory: %d\n", r1) if r1 == 0 { panic(err) } h, err := windows.LoadLibraryEx("CtApi.dll", 0, 0) if err != nil { panic(err) } fmt.Printf("library: %v\n", h) }
内容的提问来源于stack exchange,提问作者wz2b
相关产品推荐
相关产品推荐

