【问题标题】:How can I get the IUnknown* pointer (if any) for some Visual Basic 6 control?如何获得某些 Visual Basic 6 控件的 IUnknown* 指针(如果有)?
【发布时间】:2011-08-10 02:55:36
【问题描述】:

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

【问题讨论】:

    标签: c windows com vb6


    【解决方案1】:

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

    如果您需要对同一组件的附加引用,但不关心哪个接口,请使用 QueryInterface 方法来处理 IUknown

    【讨论】:

    • 我可能在这里遗漏了一些东西,但是 - 我如何在一些 Visual Basic 对象上调用QueryInterface在 Visual Basic 中?我尝试做Set o = CreateObject("COMCTL.Slider"),但返回的对象(在其上调用TypeName() 会产生Slider,因此该对象似乎是有效的)不支持QueryInterface 方法。
    • @Frerich:vb6 中的隐式类型转换是对 QueryInterface 的调用。 (set o2 = o1 将在 o1 上为 o2 的类型调用 QueryInterface。)记住在 VB6 中,IUnknown 被称为 Object(有一些限制:在实践中使用 IDispatch 更容易) .
    • 啊,这很有趣。但是,我怎样才能得到它的原始指针值(这样我就可以将它传递给一个期望采用IUnknown* 的 C 函数)?我尝试使用ObjPtr(o2)(其中o2 是一些Object)调用我的C 函数,然后将C 代码中的long 转换为IUnknown*,但这并不太奏效。实际上,现在我想起来,也许ObjPtr(o1) 实际上会产生IUnknown**?嗯……
    • @Frerich:对于 COM 接口,只需传递它。对于直接 API 调用:不确定(自从我进行任何严肃的 VB6 互操作以来已经太久了)。也许直接在这里问这个特定问题会得到答案(如果可能的话,包括 API 的 C 定义)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多