【发布时间】:2011-08-10 02:55:36
【问题描述】:
我想从一个带有IUnknown* 的Visual Basic 6 程序中调用一些C 函数。假设我知道我的 VB6 应用程序中的某些控件是 ActiveX 控件,我是否可以从中获取底层 IUnknown*(可能通过强制转换?)以将其传递给 C 函数?
【问题讨论】:
我想从一个带有IUnknown* 的Visual Basic 6 程序中调用一些C 函数。假设我知道我的 VB6 应用程序中的某些控件是 ActiveX 控件,我是否可以从中获取底层 IUnknown*(可能通过强制转换?)以将其传递给 C 函数?
【问题讨论】:
所有 COM 接口派生自IUnknown,您可以在任何有效的接口指针上使用IUnknown 方法。
如果您需要对同一组件的附加引用,但不关心哪个接口,请使用 QueryInterface 方法来处理 IUknown。
【讨论】:
QueryInterface在 Visual Basic 中?我尝试做Set o = CreateObject("COMCTL.Slider"),但返回的对象(在其上调用TypeName() 会产生Slider,因此该对象似乎是有效的)不支持QueryInterface 方法。
set o2 = o1 将在 o1 上为 o2 的类型调用 QueryInterface。)记住在 VB6 中,IUnknown 被称为 Object(有一些限制:在实践中使用 IDispatch 更容易) .
IUnknown* 的 C 函数)?我尝试使用ObjPtr(o2)(其中o2 是一些Object)调用我的C 函数,然后将C 代码中的long 转换为IUnknown*,但这并不太奏效。实际上,现在我想起来,也许ObjPtr(o1) 实际上会产生IUnknown**?嗯……
同时我发现了一件有趣的事情(只是提到它以防有人发现这个问题):对于我测试的许多控件,GetWindowLong 返回的GWL_USERDATA 值会产生一些具有@ 的结构的地址987654323@ 偏移量 12 处的指针值。因此以下可能对您有用:
IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);
似乎许多控件在GWL_USERDATA 给出的地址中存储了相同的结构。也许所有的 Visual Basic 控件都是如此?
【讨论】: