如何获取某些Visual Basic 6控件的IUnknown*指针(如果有)?
我想从VisualBasic6程序中调用一些C函数,该程序采用如何获取某些Visual Basic 6控件的IUnknown*指针(如果有)?,c,windows,com,vb6,C,Windows,Com,Vb6,我想从VisualBasic6程序中调用一些C函数,该程序采用IUnknown*。假设我知道VB6应用程序中的某个控件是ActiveX控件,我可以从中获取底层的IUnknown*(可能通过强制转换?)以将其传递给C函数吗?所有COM接口都源自IUnknown,您可以在任何有效的接口指针上使用IUnknown方法 如果您需要对同一组件的附加引用,但不关心哪个接口,那么请对IUnknown使用QueryInterface方法,所有COM接口都派生自IUnknown,您可以在任何有效的接口指针上使用I
IUnknown*
。假设我知道VB6应用程序中的某个控件是ActiveX控件,我可以从中获取底层的IUnknown*
(可能通过强制转换?)以将其传递给C函数吗?所有COM接口都源自IUnknown
,您可以在任何有效的接口指针上使用IUnknown
方法
如果您需要对同一组件的附加引用,但不关心哪个接口,那么请对IUnknown
使用QueryInterface
方法,所有COM接口都派生自IUnknown
,您可以在任何有效的接口指针上使用IUnknown
方法
如果您需要对同一组件的附加引用,但不关心哪个接口,那么请使用
QueryInterface
方法对iUnknown
进行查询。同时,我发现了一件有趣的事情(仅在有人发现这个问题时提及):对于我测试的许多控件,由GetWindowLong
返回的GWL\u USERDATA
值产生某个结构的地址,该结构的IUnknown
指针值位于偏移量12处。因此,以下内容可能适用于您:
IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);
似乎许多控件都在
GWL\u USERDATA
给定的地址中存储了相同的结构。也许所有的Visual Basic控件都是如此吧?同时我发现了一件有趣的事情(只是为了防止有人发现这个问题):对于我测试过的许多控件,由GetWindowLong
返回的GWL\u USERDATA
值产生某个结构的地址,该结构的IUnknown
指针值位于偏移量12处。因此,以下内容可能适用于您:
IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);
似乎许多控件都在
GWL\u USERDATA
给定的地址中存储了相同的结构。也许所有的Visual Basic控件都是这样?我可能在这里遗漏了一些东西,但是-如何在Visual Basic中的某个Visual Basic对象上调用QueryInterface
?我试图执行Set o=CreateObject(“COMCTL.Slider”)
,但返回的对象(在其上调用TypeName()
会产生Slider
,因此该对象看起来是有效的)不支持QueryInterface
方法。@Frerich:vb6中的隐式类型转换是对QueryInterface的调用。(set o2=o1
将调用o1
上的QueryInterface
以查找o2
的类型。)记住在VB6中,IUnknown被称为对象
(有一些限制:实际上使用IDispatch
更容易)。啊,这很有趣。但是,我如何才能得到它的原始指针值(这样我就可以将它传递给一个C函数,该函数将接受一个IUnknown*
)?我尝试用ObjPtr(o2)
(其中o2
是一些对象
)调用我的C函数,然后将C代码中的long
强制转换为IUnknown*
,但效果不太好。实际上,现在我想起来了,也许ObjPtr(o1)
实际上会产生一个IUnknown**
?嗯…@Frerich:对于COM接口,只需传递它。对于直接API调用:不确定(我已经很久没有进行任何认真的VB6互操作了)。也许在这里直接问这个特定的问题会得到一个答案(如果可能的话,包括API的C定义)。我可能在这里遗漏了一些东西,但是-我如何在Visual Basic中的某个Visual Basic对象上调用QueryInterface
?我试图执行Set o=CreateObject(“COMCTL.Slider”)
,但返回的对象(在其上调用TypeName()
会产生Slider
,因此该对象看起来是有效的)不支持QueryInterface
方法。@Frerich:vb6中的隐式类型转换是对QueryInterface的调用。(set o2=o1
将调用o1
上的QueryInterface
以查找o2
的类型。)记住在VB6中,IUnknown被称为对象
(有一些限制:实际上使用IDispatch
更容易)。啊,这很有趣。但是,我如何才能得到它的原始指针值(这样我就可以将它传递给一个C函数,该函数将接受一个IUnknown*
)?我尝试用ObjPtr(o2)
(其中o2
是一些对象
)调用我的C函数,然后将C代码中的long
强制转换为IUnknown*
,但效果不太好。实际上,现在我想起来了,也许ObjPtr(o1)
实际上会产生一个IUnknown**
?嗯…@Frerich:对于COM接口,只需传递它。对于直接API调用:不确定(我已经很久没有进行任何认真的VB6互操作了)。也许在这里直接问这个特定的问题会得到一个答案(如果可能的话,包括API的C定义)。