Accès aux DLL Windows à l'aide de COM dans Go
Votre objectif est d'exploiter une DLL Windows (XA_Session.dll) dans votre programme Go, en particulier accéder à sa méthode ConnectServer. Cependant, vous avez rencontré des difficultés en raison d'une erreur de compilation indiquant que proc.ConnectServer n'est pas défini.
Le problème provient d'un appel de méthode incorrect. Pour appeler un syscall.LazyProc, vous devez utiliser sa fonction Call, plutôt que de référencer directement ses champs. Les fonctions COM, comme DllGetClassObject, nécessitent des valeurs de paramètres spécifiques.
Dans votre cas spécifique, DllGetClassObject attend trois paramètres : un CLSID, un IID et un pointeur vers l'objet COM. Ces paramètres doivent être transmis à proc.Call en tant que uintptrs. Voici une version améliorée de votre code :
<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>
Notez que vous devez définir correctement les valeurs CLSID et IID, qui sont généralement fournies dans le fichier d'en-tête C qui accompagne la DLL. Vous devez également implémenter des fonctions wrapper pour les méthodes COM supplémentaires auxquelles vous souhaitez accéder, ce qui nécessite de comprendre leurs signatures et leur ordre exacts.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!