gpt4 book ai didi

在非托管 C++ 中使用 size_is 的 MIDL 编码(marshal)结构数组

转载 作者:行者123 更新时间:2023-12-01 10:54:30 25 4
gpt4 key购买 nike

我正在尝试通过 COM 接口(interface)检索结构数组。当结构数为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”已正确设置为正确的元素数。

为什么这行不通?

最佳答案

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

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

关于在非托管 C++ 中使用 size_is 的 MIDL 编码(marshal)结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com