Передача целых чисел без знака из C ++ COM-объекта в VB6 - PullRequest
0 голосов
/ 23 сентября 2011

Я пытаюсь получить доступ (из приложения VB6) к 32-битному типу данных без знака, возвращаемому методом COM-объекта C ++. Часть интерфейса объявлена ​​как:

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

Когда я просматриваю этот интерфейс, используя Object Browser в VB6, он показывает подсказку Function GetWidth() As <Unsupported variant type> для обоих этих методов.

Есть ли способ передать беззнаковый целочисленный тип данных в VB6?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

VB6 не имеет неподписанных типов данных. Ваш объект COM? Просто измените интерфейс на обычный, подписанный int. У вас действительно есть изображения с шириной и высотой более 2 миллиардов?

Если COM-объект не принадлежит вам, извините, его интерфейс не совместим с Automation. Вы можете собрать прокси-объект C ++, который преобразует все unsigned в int.

1 голос
/ 27 сентября 2011

Вот выдержка из 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.

...