【发布时间】:2015-03-11 08:27:56
【问题描述】:
在较早的帖子Passing pointer from managed C++/CLI to ActiveX C++ component 中,我询问了将数组(无论是托管数组还是非托管数组)传递给在本机 C++ 中创建的 activeX 组件的正确方法。 activeX 方法具有以下签名:
short Component::CopyToBuffer(short FAR* ptr) {}
当activeX被导入用于C++/CLI时
方法签名显示为
short Component::CopyToBuffer(short% ptr) {}
在 C# 中导入时显示为
short Component::CopyToBuffer(ref short ptr) {}
但是,我无法正确传递数组。
是否原生数组:short* shortsArray = new short[500];
既不是托管数组:array<short>^ shortsArray = gcnew array<short>(500);
用户 ildjarn 和 Hans Passant 建议我需要编辑互操作程序集文件以将导出的方法签名更改为 Component::(int16[] ptr) 之类的东西,我这样做并成功编译了项目但遇到了其他类型问题(类型不匹配或其他问题)。
所以现在我制作了一个重现问题解决方案的示例项目
解决方案包含:
- ActiveX 组件的项目,在 SomeCompCtl.h 中找到了一种 CopyToBuffer 方法
- C++/CLI 中的测试项目。使用添加了 activeX 的单个表单和一个按钮调用具有给定值数组的方法。
- 另一个用 C# 做同样事情的测试项目
运行项目: - 只需编译 SomeComp 以生成包含 ActiveX 的 Somecomp.ocx。 - regsrv32 ActiveX 控件
请注意,我无法访问 ActiveX 代码(我可以访问一个版本的代码,但我不能假设开发人员会继续为我提供更新版本的代码)所以任何解决方案都不应该取决于更改 ActiveX 接口或代码。我通常只有 ocx 文件及其 tlb 文件。
【问题讨论】:
-
我真的希望你在真实代码中拼写为
Component而不是Compnenet。 :) -
@Billy :上周我在工作中修复了一系列“resluts”->“results”拼写错误。美好时光。
标签: c# visual-c++ c++-cli interop activex