Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取某些Visual Basic 6控件的IUnknown*指针(如果有)?_C_Windows_Com_Vb6 - Fatal编程技术网

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

如何获取某些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

我想从VisualBasic6程序中调用一些C函数,该程序采用
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定义)。