Go에서 COM을 사용하여 Windows DLL에 액세스
목표는 특히 Go 프로그램 내에서 Windows DLL(XA_Session.dll)을 활용하는 것입니다. ConnectServer 메서드에 액세스합니다. 그러나 proc.ConnectServer가 정의되지 않았음을 나타내는 컴파일 오류로 인해 문제에 직면했습니다.
이 문제는 잘못된 메서드 호출로 인해 발생합니다. syscall.LazyProc을 호출하려면 해당 필드를 직접 참조하는 대신 호출 기능을 활용해야 합니다. DllGetClassObject와 같은 COM 함수에는 특정 매개 변수 값이 필요합니다.
특정 경우 DllGetClassObject에는 CLSID, IID 및 COM 개체에 대한 포인터라는 세 가지 매개 변수가 필요합니다. 이러한 매개변수는 proc.Call에 uintptrs로 전달되어야 합니다. 향상된 코드 버전은 다음과 같습니다.
<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>
일반적으로 DLL에 대해 함께 제공되는 C 헤더 파일에 제공되는 CLSID 및 IID 값을 올바르게 설정해야 합니다. 또한 액세스하려는 추가 COM 메서드에 대한 래퍼 함수를 구현해야 하며, 이를 위해서는 정확한 서명과 순서를 이해해야 합니다.
위 내용은 Go에서 COM을 사용하여 XA_Session.dll의 ConnectServer 메서드에 액세스하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!