2011-06-02 130 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

相關問題