2010-02-16 76 views
5

我們嘗試從原生Delphi程序傳遞一個字符串到Delphi Prism DLL。 傳遞整數沒有問題,但字符串在DLL中不匹配。 我們在回答另一個問題時看到了Robert Love's code snippet,但是沒有原生Delphi程序的代碼。如何將Delphi字符串傳遞給Prism DLL?

如何將字符串從Delphi傳遞給Delphi Prism DLL?

+3

這是一個社區,所以你不應該在你的問題中爲單個人解決問題。如果你想這樣做,他的答案寫評論。如果你寫一個問題(在這種情況下更好),儘量將其表述爲一般。 – jpfollenius 2010-02-16 13:41:04

+0

同意。羅伯特吉塞克比我能做得更好。 – 2010-04-19 15:05:47

回答

1

Delphi Win32中的字符串與.Net中的字符串的管理方式不同,因此無法將.Net字符串傳遞給Delphi Win32,反之亦然。

要交換字符串值,最好使用兩種編譯器支持的PChar類型。這與將字符串值發送給Windows API函數的方式相同。

Regards

P.S.我不是羅伯特;-)

+0

對不起,這應該是一個消息給上面提到的代碼片段的作者。點擊了錯誤的按鈕。 但無論如何,它如何使用PChar。德爾福棱鏡沒有PChar類型。如果我在本地delphi中使用pchar,並在棱鏡中使用字符串,我會得到第一個字符。但只有一個字符。 如何解決這個問題? – 2010-02-16 15:33:09

+1

別擔心,馬庫斯。你還沒有足夠的聲望點,所以你無論如何都不能在別人的問題上發表推薦。這是一個合法的問題。我已經爲你編輯它,所以它看起來不像你想發送一個直接的消息,而Stack Overflow不支持。 – 2010-02-16 15:37:40

+0

PChar只是一個指向字符的指針,要發送一個字符串就像你需要先指向第一個字符,然後指定字符串數據的長度,這樣另一端就可以從開始點讀取數據直到字符串的長度。 如果您的DLL函數正在返回任何字符串值,那麼另一端應該提供一個內存空間,並將其起始地址和長度發送給您的函數,以便您的函數可以將輸出數據寫入該內存空間。 – vcldeveloper 2010-02-16 15:41:02

8

最好的方法是使用WideString。

有幾個原因。

  • 這是Unicode和D2009
  • 它的內存OLE32.DLL中進行管理,因此在任德爾福的內存管理器或CLR GC沒有依賴性以前一樣工作。
  • 你不必直接處理指針

在OXYGENE,你可以把它寫像這樣:

type 
    Sample = static class 
    private 
    [UnmanagedExport] 
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String; 
         [MarshalAs(UnmanagedType.BStr)]out output : String); 
    end; 

implementation 

method Sample.StringTest(input : String; out output : String); 
begin 
    output := input + "ä ~ î 暗"; 
end; 

「的MarshalAs」告訴CLR如何封送字符串來回。沒有它,串作爲Ansi(PAnsiChar)傳遞,這可能是不是你想做什麼。

這是如何從Delphi使用它:

procedure StringTest(const input : WideString; out output : WideString); 
    stdcall; external 'OxygeneLib'; 

var 
    input, output : WideString; 
begin 
    input := 'A b c'; 
    StringTest(input, output); 
    Writeln(output); 
end. 

此外,永遠利用類型,即都沒有明確規定,對外部接口。 您不能使用PChar進行DLL導入或導出。因爲如果你這樣做,當你使用D7或D2009進行編譯時(這取決於原始的開發系統是什麼),你會遇到異常。

相關問題