如何获取某些 Visual Basic 6 控件的 IUnknown* 指针(如果有)?

发布于 2024-11-02 12:24:16 字数 156 浏览 1 评论 0原文

我想从 Visual Basic 6 程序中调用一些带有 IUnknown* 的 C 函数。假设我知道 VB6 应用程序中的某些控件是 ActiveX 控件,我可以从中获取底层的 IUnknown* (也许通过强制转换?)将其传递给 C 函数吗?

I'd like to call some C functions from a Visual Basic 6 program which take an IUnknown*. Assuming that I know that some control in my VB6 application is an ActiveX control, can I get the underlying IUnknown* out of that (maybe by casting?) to pass it to the C function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执笔绘流年 2024-11-09 12:24:16

所有 COM 接口均派生自IUnknown,您可以在任何有效的接口指针上使用IUnknown 方法。

如果您需要对同一组件的额外引用,但不关心哪个接口,则使用 IUknown 的 QueryInterface 方法。

All COM interfaces derive from IUnknown, you can just use the IUnknown methods on any valid interface pointer.

If you need an additional reference to the same component, but don't care about which interface then use the QueryInterface method for IUknown.

温柔一刀 2024-11-09 12:24:16

与此同时,我发现了一件有趣的事情(只是提一下,以防有人发现这个问题):对于我测试的许多控件,GetWindowLong 返回的 GWL_USERDATA 值生成地址某些结构的 IUnknown 指针值位于偏移量 12 处。因此,以下内容可能对您有用:

IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);

似乎许多控件都在 GWL_USERDATA 给出的地址处存储了相同的结构。也许对于所有 Visual Basic 控件都是如此?

One interesting thing I found out in the meanwhile (just mentioning it in case somebody finds this question): for many controls I tested, the GWL_USERDATA value returned by GetWindowLong yields the address of some struct which has the IUnknown pointer value at offset 12. So the following may work for you:

IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);

It seems many controls have the same struct stored at the address given by GWL_USERDATA. Maybe it's true for all Visual Basic controls or so?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文