You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:57:48