加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 从没有CGo的Go调用COM对象方法

发布时间:2020-12-14 05:28:43 所属栏目:Windows 来源:网络整理
导读:我在Go中创建了一个 Direct3D9 wrapper,它使用CGo与C中的COM对象进行交互. 我想摆脱Windows下对C编译器的依赖,这样用户就不必安装MinGW或Cygwin来使用Go的DirectX. 问题是d3d9.dll不暴露C函数但使用COM.加载DLL后可以直接调用的唯一函数(带有syscall.LoadLib
我在Go中创建了一个 Direct3D9 wrapper,它使用CGo与C中的COM对象进行交互.

我想摆脱Windows下对C编译器的依赖,这样用户就不必安装MinGW或Cygwin来使用Go的DirectX.

问题是d3d9.dll不暴露C函数但使用COM.加载DLL后可以直接调用的唯一函数(带有syscall.LoadLibrary(“d3d9.dll”))是Direct3DCreate9.这将返回一个COM对象,该对象将所有功能公开为方法.

如何在没有CGo的纯Go中调用DLL中的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包中的函数来获取.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读