【发布时间】:2016-10-13 09:29:15
【问题描述】:
我有一个 Windows DLL (XA_Session.dll) 文件,但我不知道如何在 golang 中使用它。
这是一个 DLL 查看器图片
我想使用ConnectServer COM 方法。
这是我的代码
package main
import (
"syscall"
"fmt"
)
var (
mod = syscall.NewLazyDLL("XA_Session.dll")
proc = mod.NewProc("DllGetClassObject")
)
func main() {
var bConnect bool
bConnect = proc.ConnectServer("hts.ebestsec.co.kr", 20001)
if bConnect {
fmt.Println("Success")
} else {
fmt.Println("Fail")
}
}
编译错误:
.\main.go:17: proc.ConnectServer 未定义(类型 *syscall.LazyProc 没有字段或方法 ConnectServer)
【问题讨论】:
-
您错误地使用了
proc。它就像函数 DllGetClassObject 的包装器,而不是 DllGetClassObject 返回的类对象。它没有这种方法。 -
我应该改变什么? @V.Kravchenko
-
我猜想在 go 中使用 com 是相当困难的。尝试更深入地研究 com 并查看这里github.com/go-ole/go-ole。
-
COM 与仅调用加载的 DLL 的导出函数不同,所以我支持@V.Kravchenko,您可能应该使用专用包来处理 COM。至于调用导出的函数,请查看您的 Go 源代码——特别是
src/syscall目录下名称与*_windows.go匹配的文件:它们包含许多使用NewProc()和syscall.Syscall*()函数的示例。 -
因此,恐怕要将 C++ 编译器生成的 DLL 与 Go 实际接口,您需要将该 DLL 包装在另一个中 - 用 C++ 编写并公开一个普通的 C 接口(通过
extern "C" { ... }"标准机制)包装这些 C++ 方法或使用 SWIG 之类的工具为 Go 创建“桥”代码。 2) 使用 COM 时,您不直接加载提供 COM 对象的 DLL,而是使用适当的 Win32 API 调用间接为您实例化 COM 对象——通过其名称或 GUID 标识符。然后也间接操作它。这就是go-ole所做的。