我有一个用 C++ 编写的 COM 服务器,它应该与用 C# 编写的客户端接口(interface)。 C++ COM 服务器将接口(interface)函数导出到一个结构中,该结构包含一个结构数组,其中包含一个数组
struct InnerStruct { int innerArray[ 100 ]; }
struct OuterStruct { int dummy; InnerStruct outerArray[ 2 ]; }
因此结构具有固定大小。
IDL 描述是
HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );
IDL 编译正常,我可以在 C# 客户端中看到结构。
问题是,当我从 C# 客户端调用接口(interface)函数时,我只在 OuterStruct 的第一个 InnerStruct 中获取/设置值。 第二个 InnerStruct 只存放垃圾。
C# 调试器显示了 OuterStruct 的正确结构,并且知道 OuterStruct 内部有 2 个 InnerStruct。
在C#中,接口(interface)函数的声明来自服务器图元文件,因此不容易更改描述。
我尝试在输入和输出参数上设置 size_is(),但 MIDL 编译器不接受。
我能否对参数设置一些特定的编码,或者如何解决通过 COM 获取完整的 OuterStruct 的问题?
最佳答案
在我尝试编写的 IDL 文件中
typedef [transmit_as(OuterStructAliasType)] OuterStruct* HelpType;
并保留其他声明
HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );
我在我的 C++ 代码中定义的位置
typedef struct OuterStructAliasType
{
char dummy[ sizeof( OuterStruct )];
} OuterStructAliasType;
这似乎有效。 也许还有其他方法可以解决这个问题。 请告诉我他们更聪明或更好。
关于c# - COM 接口(interface) c# 编码数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52969788/