3

我正在尝试通过 COM 接口检索结构数组。它在结构数为 1 时起作用。当结构数大于 1 时,只有第一个结构被正确编组。数组中的其余结构具有垃圾数据。我的界面如下所示:

typedef struct tagINTOBJINTERFACE
{
    long lObjectId;
    IMyObject* pObj;

} INTOBJINTERFACE;


[
    object,
    uuid(<removed>),
    dual,
    nonextensible,
    helpstring("Interface"),
    pointer_default(unique)
]
interface IMyInterface : IUnknown {

    HRESULT CreateObjects(
        [in] VARIANT* pvDataStream,
        [out]long* Count, 
        [out,size_is(,*Count)] INTOBJINTERFACE** ppStruct
        );
};

我像这样分配结构内存:

long lCountInterfaces = listInterfaces.GetCount();
long lMemSize = lCountInterfaces * sizeof(INTOBJINTERFACE);
INTOBJINTERFACE* pstruct = (INTOBJINTERFACE*) CoTaskMemAlloc( lMemSize );

然后填写数组中每个结构的成员。我可以在调试器中看到所有数组元素的所有成员都已正确分配。填写完结构后,我分配“*ppStruct = pstruct”来传递数组。我还可以看到输出参数“*Count”被正确设置为正确的元素数量。

为什么这不起作用?

4

2 回答 2

6

原因:您的应用程序使用 windows 中的通用编组器进行编组。通用编组器从您的类型库 (*.tlb) 中读取元数据。
生成的 typelib 不支持 size_is。

Todo:您应该使用由 Visual Studio 生成的 Proxy/Stub dll(...PS 项目)。- 构建代理/存根 dll - 调用“regsvr32” - 从您的服务器“*.rgs”文件中删除“TypeLib = s '{?????-...-????}'”条目

于 2013-07-17T08:52:32.593 回答
0

除了 Joerg 的回答说 usingsize_is是不可能的,这里有什么是可能的:SAFEARRAY.

关键词:UDT的Safearray

解释和例子在这里

简短的摘要:

  1. 使用 GUID 定义结构。
  2. 使用类型库创建描述您的结构的 IRecordInfo 类型的对象。
  3. 用于SafeArrayCreateEx创建SAFEARRAY类型VT_RECORD
  4. 用数据填充它。
  5. 取回另一边。
于 2018-08-10T18:58:22.010 回答