是否有可能在GO中找到Windows上加载的DLL的路径?

问题描述 投票:0回答:1

我有以下GO代码:

package main

import (
    "syscall"
)

func main() {
    var mod, _ = syscall.LoadLibrary("user32.dll")
}

哪个成功加载了user32.dll文件。 (这是我在网上找到的一个例子的修改版本)。

但是我不知道这个DLL存在于文件系统的哪个位置。我一直在寻找一种方式让Go能够通过syscall libs告诉我,但还没有找到办法。

有谁知道一种方法来获取加载的DLL的路径?

go
1个回答
0
投票

我现在无法访问运行Go的Windows机器,但它应该是这样的。请注意代码中缺少适当的资源/错误管理。

请测试并分享您的结果,以便我可以修改/编辑我的答案。

var (
kernel32, _        = syscall.LoadLibrary("kernel32.dll")
getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")
getModuleFilename, _ = syscall.GetProcAddress(kernel32, "GetModuleFileNameA")
)

func StringToCharPtr(str string) *uint8 {
    chars := append([]byte(str), 0) // null terminated
    return &chars[0]
}

func GetDllFileName() (filename byte[]) {
    var nargs uintptr = 1
    var handle uintprt
    modulename = StringToPtrChar("user32.dll")

    if ret, _, callErr := syscall.Syscall(uintptr(getModuleHandle), nargs, modulename, 0, 0); callErr != 0 {
        panic("Call GetModuleHandle")
    } else {
     handle = ret
    }
    name = make(byte[],50) // I'm making this number out of the blue
    nargs = 3
    if ret, _, callErr := syscall.Syscall(uintptr(getModuleFilename), nargs, handle, &name[0], 50); callErr != 0 {
        panic("Call GetModuleFileName")
    }
    else{
      filename = name
    }
    return
}
© www.soinside.com 2019 - 2024. All rights reserved.