Можно ли найти путь к загруженной DLL на Windows в GO? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть следующий код GO:

package main

import (
    "syscall"
)

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

, который успешно загружает файл user32.dll.(Это измененная версия примера, который я нашел в Интернете).

Однако я не знаю, где в файловой системе существует эта DLL.Я искал способ, чтобы Go мог сказать мне об этом через syscall libs, но не нашел способа сделать это.

Кто-нибудь знает способ получить путь кDLL, которая была загружена?

1 Ответ

0 голосов
/ 28 марта 2019

У меня нет доступа к машине с Windows, на которой сейчас запущена Go, но должно быть чем-то вроде этого. Обратите внимание на отсутствие надлежащего управления ресурсами / ошибками в коде.

Пожалуйста, проверьте его и поделитесь своими результатами, чтобы я мог изменить / отредактировать свой ответ.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...