Go で COM を使用して Windows DLL にアクセスする
あなたの目標は、特に Go プログラム内で Windows DLL (XA_Session.dll) を活用することです。 ConnectServer メソッドにアクセスします。ただし、proc.ConnectServer が未定義であることを示すコンパイル エラーが原因で、課題に直面しました。
この問題は、メソッドの呼び出しが正しくないことが原因です。 syscall.LazyProc を呼び出すには、そのフィールドを直接参照するのではなく、その Call 関数を利用する必要があります。 DllGetClassObject などの COM 関数には、特定のパラメーター値が必要です。
特定のケースでは、DllGetClassObject は 3 つのパラメーター (CLSID、IID、COM オブジェクトへのポインター) を必要とします。これらのパラメータは uintptrs として proc.Call に渡す必要があります。コードの改良版は次のとおりです。
<code class="go">package main import ( "syscall" "fmt" ) var ( xaSession = syscall.NewLazyDLL("XA_Session.dll") getClassObject = xaSession.NewProc("DllGetClassObject") ) func main() { // TODO: Set these variables to the appropriate values var rclsid, riid, ppv uintptr ret, _, _ := getClassObject.Call(rclsid, riid, ppv) // Check ret for errors (assuming it's an HRESULT) // Assuming ppv now points to your XA_Session object, you can // create wrapper types to access its methods: type XASession struct { vtbl *xaSessionVtbl } type xaSessionVtbl struct { // Every COM object starts with these three QueryInterface uintptr AddRef uintptr Release uintptr // Additional methods of this COM object ConnectServer uintptr DisconnectServer uintptr } xasession := NewXASession(ppv) if b := xasession.ConnectServer(20001); b == 1 { fmt.Println("Success") } else { fmt.Println("Fail") } }</code>
CLSID と IID の値を正しく設定する必要があることに注意してください。通常、これらの値は DLL に付属の C ヘッダー ファイルで提供されます。また、アクセスしたい追加の COM メソッドのラッパー関数を実装する必要があります。これには、正確な署名と順序を理解する必要があります。
以上がGo で COM を使用して XA_Session.dll の ConnectServer メソッドにアクセスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。