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 中国語 Web サイトの他の関連記事を参照してください。