我有一个用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;
这似乎有效。 也许还有其他方法可以解决问题。 请告诉我他们更聪明或更好。