COM 接口 c# 封送数组数组



我有一个用C++编写的COM服务器,它应该与用C#编写的客户端接口。 C++ COM 服务器将接口函数导出到一个结构,该结构保存一个结构数组,其中包含一个数组

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# 客户端调用接口函数时,我只获取/设置外部结构中第一个 InnerStruct 中的值。 第二个内部结构只容纳垃圾。

C# 调试器显示了 OuterStruct 的正确结构,并知道 OuterStruct 中有 2 个 InnerStruct。

在 C# 中,接口函数的声明来自服务器图元文件,因此更改说明并不容易。

我尝试在输入和输出参数上设置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;

这似乎有效。 也许还有其他方法可以解决问题。 请告诉我他们更聪明或更好。

最新更新