> 백엔드 개발 > Golang > 종속성이 System 또는 System32에 없는 LoadDLL로 이동합니다.

종속성이 System 또는 System32에 없는 LoadDLL로 이동합니다.

PHPz
풀어 주다: 2024-02-08 22:30:20
앞으로
719명이 탐색했습니다.

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 搜索路径?

更新

我认为我遇到的问题是因为我指定了 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\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)

}
로그인 후 복사

解决方法

尝试在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 版本上都可用。请参阅此处的代码注释

위 내용은 종속성이 System 또는 System32에 없는 LoadDLL로 이동합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿