Introduction :
Accès aux fonctions COM (Component Object Model) depuis l'intérieur Go peut présenter un défi. Cet article vise à résoudre ce problème en vous guidant tout au long du processus d'appel des méthodes COM depuis Go, à l'aide d'un exemple spécifique pour illustrer la technique.
Contexte :
Les tentatives de code fournies pour appeler la méthode ConnectServer d'une DLL Windows via la fonction DllGetClassObject. Cependant, le compilateur génère une erreur en raison de l'utilisation incorrecte de syscall.LazyProc.
Solution :
Pour résoudre l'erreur, il est nécessaire d'utiliser la méthode Call de syscall .LazyProc pour transmettre les arguments appropriés, convertis en uintptrs, conformément à la signature de DllGetClassObject. Le code ci-dessous décrit la modification :
<code class="go">ret, _, _ := getClassObject.Call(rclsid, riid, ppv)</code>
COM Object Wrapping :
Une fois l'objet COM obtenu, des types de wrapper Go peuvent être créés pour permettre l'interaction avec ses méthodes. Cela implique de définir un type personnalisé avec un pointeur vtbl (table virtuelle) et d'introduire des méthodes qui correspondent aux fonctions de l'objet COM.
Exemple :
Pour l'objet hypothétique XA_Session avec le ConnectServer et DisconnectServer, un wrapper Go pourrait ressembler à ceci :
<code class="go">type XASession struct { vtbl *xaSessionVtbl } func (obj *XASession) ConnectServer(id int) int { ret, _, _ := syscall.Syscall( obj.vtbl.ConnectServer, // function address 2, // number of parameters to this function uintptr(unsafe.Pointer(obj)), // always pass the COM object address first uintptr(id), // then all function parameters follow 0, ) return int(ret) } func (obj *XASession) DisconnectServer() { syscall.Syscall( obj.vtbl.DisconnectServer, 1, uintptr(unsafe.Pointer(obj)), 0, 0, ) }</code>
En utilisant cette approche, il devient possible d'interagir avec les objets COM et d'accéder de manière transparente à leurs méthodes depuis Go.
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!