gpt4 book ai didi

visual-c++ - 是否定义了在 COM 接口(interface)中传递的结构的打包?

转载 作者:行者123 更新时间:2023-12-04 16:48:25 27 4
gpt4 key购买 nike

我正在使用具有自己的自定义接口(interface)的第三方 COM 服务器,该接口(interface)将结构设置和获取作为它的一些属性。碰巧我正在为客户端使用 C++。我从下面的 IDL 文件中发布了一些具有代表性的代码,其中更改了名称并删除了 GUID。

结构的打包是否已定义,或者我的客户端代码恰好使用构建 COM 服务器所用的相同打包设置只是幸运?在默认 C++ 编译器打包设置已更改的项目中是否可能出错?我可以使用编译指示包设置来确保客户端编译器打包设置正确吗?

在 IDL 或从 MIDL 生成的头文件中,我看不到任何打包编译指示或语句。如果客户端使用 C# 或 VB 会发生什么?如果通过 IDispatch 机制调用,是否更清楚地指定了打包行为?

struct MyStruct
{
int a, b;
};

[
object,
uuid( /* removed */ ),
dual,
nonextensible,
pointer_default(unique)
]
interface IVideoOutputSettings : IDispatch{

[propget, id(1), HRESULT MyProperty([out, retval] struct MyStruct* pVal);
[propput, id(1), HRESULT MyProperty([in] struct MyStruct newVal);

/* other methods */
};

最佳答案

是的,结构是 COM 中的一个问题。如果您使用基于 IUnknown 的接口(interface),则必须使用适当的编译器设置掷骰子。更改默认值的几个原因。

如果使用 COM 自动化,则必须在 .IDL 中使用 typedef 声明结构。以便客户端代码可以使用 IRecordInfo 在类型库信息的指导下正确访问结构。您所要做的就是确保您的编译器的/Zp 设置与 midl.exe 的/Zp 设置相匹配。做起来不难。

通过意识到任何结构都可以通过具有属性的接口(interface)来描述,您可以完全绕过这个问题。现在没关系了。

关于visual-c++ - 是否定义了在 COM 接口(interface)中传递的结构的打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145499/

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