2013-05-09 150 views
3

我在c#環境中爲delphi導入的ActiveX控件傳輸數據時遇到一些問題。將Delphi PChar傳遞給C#


我在delphi一側有一個函數,它接受並返回PChar。我可以修改它或做任何我想要的東西。

function TActiveFormX.DelphiFunction(S: PChar): PChar; 
begin 
    ///do something with 'S' 
    result:=S; 
end; 

而執行程序的C#側是一個函數,它調用Delphi函數,給它一個字符串參數來啃。

public void CSharpFunction() 
{ 
    string a = axActiveFormX1.DelphiFunction("sampleString"); 
} 

我測試過它,顯然一切都很好,直到C#接收返回PChar類型。然後,整個應用程序停止響應並退出。我試圖實現try-catch塊來查看異常消息,但該應用程序在顯示任何內容之前只是崩潰。

我想它會因爲變量不是同一類型而崩潰。或者因爲殘酷的軟件版本不匹配:Delphi 5 + Visual Studio 2012.我搜索了這個,但到目前爲止還沒有運氣。

任何幫助表示讚賞:)

+1

請在C#端顯示DelphiFunction的聲明 – 2013-05-09 08:54:31

+0

@David Heffernan是什麼聲明?我是Delphi-to-c#的新手,不明白你在問什麼:D – 2013-05-09 08:57:39

+0

你已經展示了調用函數的代碼。但是必須有一些C#聲明函數。 – 2013-05-09 09:02:38

回答

1

您的德爾福功能設計不正確的互操作性。如果Delphi函數返回一個字符串,那麼您需要同意使用共享堆,以便被調用者可以分配字符串,並且調用者可以釋放該字符串。

處理這個問題的正常方法是使用COM BSTR,它由Delphi中的WideString封裝。這使用共享的COM堆,因此您可以在一個模塊中分配並在另一個模塊中取消分配。

因爲Delphi使用MS工具中的不同ABI作爲返回值,所以不可能使用WideString作爲interop的返回值。這是在這裏更詳細地討論:Why can a WideString not be used as a function return value for interop?

因此,你應該通過輸出參數返回字符串:

procedure Foo(const Input: WideString; out Output: WideString); 

你的C#類型庫將能夠正確導入。

+0

我會給它一個鏡頭 – 2013-05-09 09:02:17

+0

即使發佈,程序也不會在c#中顯示。 – 2013-05-09 09:10:58

+0

請記住,您還沒有給出關於如何將這個Delphi庫導入到C#代碼中的任何細節。所以我在黑暗中工作。我不知道你是否重新將組件導入到C#中。繼續嘗試。您仍然沒有在評論中顯示我要求的信息。請編輯問題以顯示此內容。 – 2013-05-09 09:14:52