c# - COM 接口(interface) c# 编码数组数组

标签 c# c++ arrays com marshalling

我有一个用 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/

相关文章:

javascript - javascript如何将字符串转换为数字数组

c# - 如何为自托管 WCF 服务启用跨域调用

c# - 我是否缺少Windows服务的替代品?

c# - 我们可以在 web.config 中为 SSO 使用多个联合配置吗?

c++ - 如何在纯 win32 的 EDIT 控件中垂直居中文本?

c++ - 将源代码翻译成外语

c++ - 函数调用参数,char * vs string 默认构造函数

javascript - 如何在脚本部分中使用我的 php 代码部分中的变量?

c# - 通过索引器访问 C# 中的属性

c# - LINQ To SQL 线程安全