У меня нет доступа к машине с 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
}