首页 > 后端开发 > Golang > 正文

go LoadDLL 其依赖项不在 System 或 System32 中

PHPz
发布: 2024-02-08 22:30:20
转载
820人浏览过

go loaddll 其依赖项不在 system 或 system32 中

php小编百草在这里为大家介绍一种常见的错误提示:“go LoadDLL 其依赖项不在 System 或 System32 中”。当我们在使用go语言编写程序时,有时会遇到这个错误提示,表示我们的程序在加载动态链接库时找不到依赖项所在的路径。这个问题可能会导致程序无法正常运行,因此我们需要解决这个问题才能继续进行开发工作。在本文中,我们将详细介绍如何解决这个错误,并提供一些常见的解决方法和技巧。

问题内容

我正在尝试从 windows 上的 go 加载库,如下所示:

citect, err := syscall.loaddll("c:\program files (x86)\aveva plant scada\bin\bin (x64)ctapi.dll")
登录后复制

问题是该库在该目录中也有依赖项。结果是错误“找不到指定的模块”。我很确定它失败是因为其他 dll 中未满足的依赖关系。

系统调用是否有某种方法可以强制 dll 搜索路径?

更新

FashionLabs
FashionLabs

AI服装模特、商品图,可商用,低价提升销量神器

FashionLabs 86
查看详情 FashionLabs

我认为我遇到的问题是因为我指定了 load_library_search_user_dirs 但我尝试加载的库也需要标准搜索路径。我添加了 load_library_search_default_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
", r1)
    if r1 == 0 {
        panic(err)
    }

    h, err := windows.LoadLibraryEx("CtApi.dll", 0, 0)

    if err != nil {
        panic(err)
    }

    fmt.Printf("library: %v
", h)

}
登录后复制

解决方法

尝试在golang.org/x/sys/windows包中使用loadlibraryex,它支持load_library_search_*标志(参见使用 load_library_search 标志的搜索顺序)。

package main

import (
    "golang.org/x/sys/windows"
)

func main() {
    name := "C:\Program Files (x86)\AVEVA Plant SCADA\Bin\Bin (x64)CtApi.dll"
    h, err := windows.LoadLibraryEx(name, 0, windows.LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)
    if err != nil {
        panic(err)
    }

    dll := &windows.DLL{
        Name:   name,
        Handle: h,
    }

    // use the dll
}
登录后复制

请注意,load_library_search_* 标志并非在所有 windows 版本上都可用。请参阅此处的代码注释

以上就是go LoadDLL 其依赖项不在 System 或 System32 中的详细内容,更多请关注php中文网其它相关文章!

相关标签:
.dll文件大全
.dll文件大全

.dll文件缺失怎么办?.dll文件在哪下载?不用担心,这里为大家提供了所有的.dll文件下载,无论用户丢失的是什么.dll文件,在这里都能找到。用户保存后,在网盘搜索dll文件全称即可查找下载!

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号