簡體   English   中英

將Delphi PChar傳遞給C#

[英]Passing Delphi PChar to C#

我在c#環境中為delphi導入的activeX控件傳輸數據時遇到了一些問題。


我在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塊來查看Exception消息,但應用程序只是在顯示任何內容之前崩潰。

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

任何幫助贊賞:)

您的Delphi功能設計不正確。 如果Delphi函數返回一個字符串,那么你需要同意使用共享堆,以便被調用者可以分配字符串,並且調用者可以解除分配它。

解決這個問題的常用方法是使用COM BSTR,它由Delphi中的WideString包裝。 這使用共享COM堆,因此您可以在一個模塊中分配並在另一個模塊中解除分配。

由於Delphi使用MS工具中的不同ABI作為返回值,因此無法使用WideString作為互操作的返回值。 這里將對此進行更詳細的討論: 為什么WideString不能用作互操作的函數返回值?

所以你應該通過out參數返回字符串:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM