您想要在 Go 程序中使用 Windows DLL 文件,但在以下情况下遇到错误调用 COM 方法。
当使用 syscall.LazyProc 从 Go 调用 COM 方法时,需要使用 LazyProc 对象提供的 Call 函数。 Call 函数期望所有参数都作为 uintptrs 传递。
例如,让我们从引用线程中提到的 Direct3D9 Go 包装器示例中获取 DllGetClassObject 函数。它的签名是:
HRESULT __stdcall DllGetClassObject( _In_ REFCLSID rclsid, _In_ REFIID riid, _Out_ LPVOID *ppv );
要使用 Call 调用此函数,您需要执行以下操作:
// TODO set these variables to the appropriate values var rclsid, riid, ppv uintptr ret, _, _ := getClassObject.Call(rclsid, riid, ppv) // ret is the HRESULT value returned by DllGetClassObject, check it for errors
对于 XA_Session 对象,您需要包装它在 Go 类型中,然后为要使用的每个 COM 方法定义包装方法。这是 ConnectServer 和 DisconnectServer 方法的简化包装器:
package xasession import "syscall" type XASession struct { // ... } func (obj *XASession) ConnectServer(id int) int { // ... } func (obj *XASession) DisconnectServer() { // ... }
以上是如何使用 syscall.LazyProc 从 Go 调用 COM 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!