Zugriff auf Windows-DLLs mit COM in Go
Ihr Ziel ist es, insbesondere eine Windows-DLL (XA_Session.dll) innerhalb Ihres Go-Programms zu nutzen Zugriff auf seine ConnectServer-Methode. Aufgrund eines Kompilierungsfehlers, der darauf hindeutet, dass proc.ConnectServer nicht definiert ist, standen Sie jedoch vor Herausforderungen.
Das Problem ist auf den falschen Methodenaufruf zurückzuführen. Um einen syscall.LazyProc aufzurufen, müssen Sie seine Call-Funktion verwenden, anstatt direkt auf seine Felder zu verweisen. COM-Funktionen wie DllGetClassObject erfordern bestimmte Parameterwerte.
In Ihrem speziellen Fall erwartet DllGetClassObject drei Parameter: eine CLSID, IID und einen Zeiger auf das COM-Objekt. Diese Parameter sollten als uintptrs an proc.Call übergeben werden. Hier ist eine verbesserte Version Ihres Codes:
<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>
Beachten Sie, dass Sie die CLSID- und IID-Werte korrekt festlegen müssen, die normalerweise in der begleitenden C-Header-Datei für die DLL bereitgestellt werden. Sie müssen außerdem Wrapper-Funktionen für die zusätzlichen COM-Methoden implementieren, auf die Sie zugreifen möchten. Dazu müssen Sie deren genaue Signaturen und Reihenfolge kennen.
Das obige ist der detaillierte Inhalt vonWie greife ich mithilfe von COM in Go auf die ConnectServer-Methode in XA_Session.dll zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!