【问题标题】:Passing unsigned integers from C++ COM object to VB6将无符号整数从 C++ COM 对象传递到 VB6
【发布时间】:2011-11-23 04:39:51
【问题描述】:

我正在尝试访问(从 VB6 应用程序)由 C++ COM 对象的方法返回的无符号 32 位整数数据类型。接口的部分声明如下:

...
interface ICOMCanvasPixelBuffer : IUnknown
{
    HRESULT GetWidth([retval][out] DWORD *pWidth);
    HRESULT GetHeight([retval][out] unsigned __int32 *pHeight);
    ...

当我在 VB6 中使用 Object Browser 浏览此界面时,它会显示这两种方法的 Function GetWidth() As <Unsupported variant type> 提示。

有没有办法将无符号整数数据类型传递给VB6?

【问题讨论】:

  • 很难猜出作者为什么还要费心为它生成一个类型库。后期绑定也出来了,只有实现了 IDispatch 才有效。
  • @Hans,COM对象是我的,所以我需要生成一个tlb来在VB6中使用这个对象。

标签: c++ com vb6


【解决方案1】:

VB6 没有无符号数据类型。 COM 对象是你的吗?只需将接口更改为常规的签名 int。你真的有宽高超过 20 亿的图片吗?

如果 COM 对象不是您的,抱歉,它的接口不符合自动化标准。您可以将所有 unsigned 转换为 int 的代理 C++ 对象放在一起。

【讨论】:

    【解决方案2】:

    这是 Wnidows SDK 的摘录,它对理解使用哪些类型非常有帮助:

    enum VARENUM {
        VT_EMPTY = 0,
        VT_NULL = 1,
        VT_I2 = 2,
        VT_I4 = 3,
        VT_R4 = 4,
        VT_R8 = 5,
        VT_CY = 6,
        VT_DATE = 7,
        VT_BSTR = 8,
        VT_DISPATCH = 9,
        VT_ERROR = 10,
        VT_BOOL = 11,
        VT_VARIANT = 12,
        VT_UNKNOWN = 13,
        VT_DECIMAL = 14,
        VT_I1 = 16,
        VT_UI1 = 17,
        VT_UI2 = 18,
        VT_UI4 = 19,
        // on and on
    

    您将绝对安全地保持在 16 以上(对于字节数组可能使用 VT_ARRAY | VT_UI1,这也很常见),并且该集合足够灵活,可以涵盖很多场景。

    在您的特殊情况下,您将需要VT_I4,即LONG

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2012-08-21
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2022-01-26
      • 2018-07-29
      相关资源
      最近更新 更多