【问题标题】:Passing an array from managed code to unmanaged C++ ActiveX component将数组从托管代码传递到非托管 C++ ActiveX 组件
【发布时间】: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


【解决方案1】:

签名为CopyToBuffer(short% ptr),你怎么称呼它?如果您执行了CopyToBuffer(myArray[0])CopyToBuffer(&myArray[0]),则可能会失败,因为垃圾收集器可能会将数组移到您身上。试试这个:

pin_ptr<short> pinned = &myArray[0];
component->CopyToBuffer(pinned);

如果这不起作用,请尝试再次编辑互操作程序集文件,将签名更改为 CopyToBuffer(IntPtr ptr)。由于参数是一个简单的指针这一事实更加明确,也许这样会更好。

【讨论】:

  • 我尝试了编译器给出以下消息的第一个选项: AxSomeCompLib::AxSomeComp::CopyToBuffer' : cannot convert parameter 1 from 'cli::pin_ptr' to 'short %.对于第二个选项,我会尝试。谢谢。
  • 我不知道如何将方法签名更改为CopyToBuffer(IntPtr ptr)。 ilasm.exe 在标记“IntPtr”处给出语法错误。
猜你喜欢
  • 2011-11-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2013-02-09
  • 2011-02-27
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多