我在Go中创建了一个
Direct3D9 wrapper,它使用CGo与C中的COM对象进行交互.
我想摆脱Windows下对C编译器的依赖,这样用户就不必安装MinGW或Cygwin来使用Go的DirectX.
问题是d3d9.dll不暴露C函数但使用COM.加载DLL后可以直接调用的唯一函数(带有syscall.LoadLibrary(“d3d9.dll”))是Direct3DCreate9.这将返回一个COM对象,该对象将所有功能公开为方法.
我知道Go-OLE库,它声称它没有CGo调用COM接口,但我不能从源头看到我将如何为Direct3D9做同样的事情.只有相关部分的简单示例将会有很大帮助.
解决方法
(不是一个全面的答案,因为我没有时间对此进行实际测试,但仍然……)
虽然MSDN大多数时候都假设您使用某些具有内置“粘合剂”的平台(例如Visual C™产品或类似的东西)来处理COM对象,但实际上可以使用普通的COM对象. C-look here和here首发.
研究这些资源,您可以了解到在“COM接口”上调用方法相当于正确使用其“VTBL”(虚函数TaBLe)块,该块始终位于相对于由“接口”伪装的指针的众所周知的位置.实例化COM对象的函数返回的“thing”.
go-ole包在普通的Go中实现了你在普通C中所做的事情,所以凭借“调用我们需要在其VTBL上操作的COM对象上的方法”的知识,我们可以在其中找到IDispatch
support的实现包.所以我从那里开始.
我还要直接进入go-ole问题跟踪器,要求实现一段示例代码,该代码将演示如何调用COM对象的处理程序上的方法,而不是通过调用go-ole包中的函数来获取.