2011-06-02 110 views
1

在之前的帖子Passing pointer from managed C++/CLI to ActiveX C++ component我问过将数组(无论是托管数组还是非托管数组)传递给在本机C++中创建的activeX组件的正确方法。 该ActiveX方法具有以下特征:将数组从托管代码传递到非托管C++ ActiveX组件

short Component::CopyToBuffer(short FAR* ptr) {} 

时,ActiveX导入在C中使用++/CLI

在C#导入时方法签名被显示为

short Component::CopyToBuffer(short% ptr) {} 

它显示为

short Component::CopyToBuffer(ref short ptr) {} 

但是,我没有能够pa正确地连接阵列。

无论是本地阵列:short* shortsArray = new short[500];

既不是管理的阵列:array<short>^ shortsArray = gcnew array<short>(500);

用户ildjarn和汉斯帕桑特建议我需要编辑互操作程序集文件导出的方法签名更改为类似组件:: (int16 [] ptr),我做了并成功编译了该项目,但遇到了其他类型的问题(类型不匹配或其他)。

所以,现在我做了再现problemnSolution一个示例项目
该解决方案包含:

  • 一种用一个方法CopyToBuffer ActiveX组件项目SomeCompCtl.h
  • 测试项目中找到在C++/CLI中。带有添加了activeX的单一窗体,并且按钮使用给定值的数组调用该方法。
  • 在C#中的另一个测试项目,做同样的事情

要运行项目: - 简单地编译SomeComp产生Somecomp.ocx其中包含ActiveX。 - regsrv32的ActiveX控件

请注意,我没有访问ActiveX代码(我有权访问一个版本的代码,但我不能认为开发人员会继续向我提供代码的更新版本),所以任何解决方案都不应该依赖于更改ActiveX接口或代码。我通常只有带有tlb文件的ocx文件。

+2

我真的希望你在实际的代码中拼写出'Component'而不是'Compnenet'。 :) – 2011-06-02 16:56:46

+1

@Billy:上周我在工作中修复了一系列'resluts' - >'results'错别字。美好时光。 – ildjarn 2011-06-02 19:26:41

回答

0

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

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

如果还是不行,请尝试重新编辑互操作程序集文件,签名更改为CopyToBuffer(IntPtr ptr)。由于参数是一个简单指针的事实更明确,所以这可能会更好。

+0

我试过编译器给出以下消息的第一个选项:AxSomeCompLib :: AxSomeComp :: CopyToBuffer':不能将参数1从'cli :: pin_ptr '转换为'short%。对于第二种选择,我会尝试。谢谢。 – X5X 2011-06-02 21:59:23

+0

我不知道如何将方法签名更改为'CopyToBuffer(IntPtr ptr)'。 ilasm.exe在标记'IntPtr'处给出语法错误。 – X5X 2011-06-02 22:05:31

相关问题