我有一个正在尝试使用 MIDL 3.0 定义的现有接口。它的一种方法具有此 C++ 签名:
HRESULT GetArray(struct FOO** outArray, uint32_t* outSize);
我尝试将其翻译为 IDL,如下所示:
namespace Examples {
struct Foo {
Int32 n1;
Int32 n2;
};
interface IExample {
void GetArray(out Foo[] array);
}
}
但是,生成的 C++/WinRT ABI 具有相反顺序的参数:
template <> struct abi<Examples::IExample>{ struct type : IInspectable
{
virtual HRESULT __stdcall GetArray(uint32_t* __arraySize, struct struct_Examples_Foo** array) noexcept = 0;
};};
考虑到这是推荐的顺序,这确实有意义。不幸的是,我没有能力改变现有接口的参数顺序。相反,我认为我可以使用“经典”风格来解决它:
namespace Examples {
[uuid("d7675bdc-7b6e-4936-a4a0-f113c1a3ef70"), version(1)]
interface IExample {
HRESULT GetArray(
[out, size_is(, *size)] Foo** array,
[out] unsigned long* size
);
}
}
但是,这被 MIDL 编译器拒绝:
MIDL4058: [msg]The size parameter of an array parameter must appear directly before the array parameter. [context]size
如何在 IDL 中编写此接口以产生正确的 ABI?