我有一个用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;
这似乎有效。
可能还有其他方法可以达到目的。
请告诉我他们更聪明或更出色。