Maison  >  Article  >  développement back-end  >  Comment appeler des méthodes COM depuis Go à l’aide de syscall.LazyProc ?

Comment appeler des méthodes COM depuis Go à l’aide de syscall.LazyProc ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 03:48:01921parcourir

How to Call COM Methods from Go Using syscall.LazyProc?

Utilisation de COM dans Go

Problème

Vous souhaitez utiliser un fichier DLL Windows dans votre programme Go, mais vous rencontrez une erreur lorsque appeler une méthode COM.

Solution

Lors de l'appel de méthodes COM depuis Go à l'aide d'un syscall.LazyProc, vous devez utiliser la fonction Call fournie par l'objet LazyProc. La fonction Call s'attend à ce que tous les paramètres soient transmis sous la forme uintptrs.

Par exemple, prenons la fonction DllGetClassObject de l'exemple de wrapper Direct3D9 Go mentionné dans le fil de discussion référencé. Sa signature est :

HRESULT __stdcall DllGetClassObject(
  _In_  REFCLSID rclsid,
  _In_  REFIID   riid,
  _Out_ LPVOID   *ppv
);

Pour appeler cette fonction à l'aide de Call, vous devrez faire quelque chose comme ceci :

// 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

Dans le cas de votre objet XA_Session, vous devez envelopper dans un type Go, puis définissez des méthodes wrapper pour chaque méthode COM que vous souhaitez utiliser. Voici un wrapper simplifié pour les méthodes ConnectServer et DisconnectServer :

package xasession

import "syscall"

type XASession struct {
    // ...
}

func (obj *XASession) ConnectServer(id int) int {
    // ...
}

func (obj *XASession) DisconnectServer() {
    // ...
}

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn