我有一个用C++编写的COM服务器,该服务器应与用C#编写的客户端进行交互。
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)函数的声明来自服务器图元文件,因此更改描述并不容易。

我尝试在in和out参数上设置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;

这似乎有效。
可能还有其他方法可以达到目的。
请告诉我他们更聪明或更出色。

10-04 18:41