Тип SAFEARRAY не известен при компиляции с использованием MIDL

Мой файл ODL выглядит так:

import "oaidl.idl";
import "ocidl.idl";

[oleautomation, uuid(/* redacted */)]
interface ISomething : IUnknown
{
    HRESULT DoSomething(
        [in]BSTR User,
        [in]VARIANT Object,
        [in]SAFEARRAY Array         // may be NULL
        );
}

Я получаю ошибки:

1>. \ Something.odl (17): ошибка MIDL2139: тип параметра не может быть получен из void или void *: [Тип 'PVOID' (параметр 'Array') ] 1>.\Something.odl(17): ошибка MIDL2105: pointee / array не имеет никакого размера: [Поле 'rgsabound' из Struct 'tagSAFEARRAY' (Параметр 'Array') ] 1>.\Something.odl(17): ошибка MIDL2465: Структуры, содержащие совместимые массивы, должны быть переданы ссылка. См. MSDN для более подробной информации: [ Struct 'tagSAFEARRAY' (Параметр 'Array')]

Если я изменю тип с SAFEARRAY в SAFEARRAY* (что я не считаю правильным?) Я получаю разные ошибки:

1>. \ Something.odl (17): ошибка MIDL2139: тип параметра не может быть получен из void или void *: [Тип 'PVOID' (параметр 'Array') ] 1>.\Something.odl(17): ошибка MIDL2105: pointee / array не имеет размера: [Поле 'rgsabound' из Struct 'tagSAFEARRAY' (Параметр 'Array')]

Это просто случай, когда мне нужно включить некоторые другие заголовки? Я компилирую, используя компилятор MIDL в VS2013, по-видимому, командная строка выглядит так:

/iid "./source/Something_i.c" /h "Something.h" /W1 /char signed /notlb /app_config /nologo /dlldata "./source/Something_dlldata.c" /proxy "./source/Something_p.c" 

1 ответ

Решение

Вам необходимо указать тип элементов в вашем SafeArray. Например, SAFEARRAY(unsigned char) * Данные для массива беззнаковых символов. Если тип данных элементов массива является переменным во время выполнения, вы можете передать элементы как SafeArray из VARIANT. Например:

import "oaidl.idl";
import "ocidl.idl";

[oleautomation, uuid(/* redacted */)]
interface ISomething : IUnknown
{
    HRESULT DoSomething(
        [in]BSTR User,
        [in]VARIANT Object,
        [in]SAFEARRAY(unsigned char) *Array         // may be NULL
        );
}
Другие вопросы по тегам