我們嘗試從原生Delphi程序傳遞一個字符串到Delphi Prism DLL。 傳遞整數沒有問題,但字符串在DLL中不匹配。 我們在回答另一個問題時看到了Robert Love's code snippet,但是沒有原生Delphi程序的代碼。如何將Delphi字符串傳遞給Prism DLL?
如何將字符串從Delphi傳遞給Delphi Prism DLL?
我們嘗試從原生Delphi程序傳遞一個字符串到Delphi Prism DLL。 傳遞整數沒有問題,但字符串在DLL中不匹配。 我們在回答另一個問題時看到了Robert Love's code snippet,但是沒有原生Delphi程序的代碼。如何將Delphi字符串傳遞給Prism DLL?
如何將字符串從Delphi傳遞給Delphi Prism DLL?
Delphi Win32中的字符串與.Net中的字符串的管理方式不同,因此無法將.Net字符串傳遞給Delphi Win32,反之亦然。
要交換字符串值,最好使用兩種編譯器支持的PChar類型。這與將字符串值發送給Windows API函數的方式相同。
Regards
P.S.我不是羅伯特;-)
對不起,這應該是一個消息給上面提到的代碼片段的作者。點擊了錯誤的按鈕。 但無論如何,它如何使用PChar。德爾福棱鏡沒有PChar類型。如果我在本地delphi中使用pchar,並在棱鏡中使用字符串,我會得到第一個字符。但只有一個字符。 如何解決這個問題? – 2010-02-16 15:33:09
別擔心,馬庫斯。你還沒有足夠的聲望點,所以你無論如何都不能在別人的問題上發表推薦。這是一個合法的問題。我已經爲你編輯它,所以它看起來不像你想發送一個直接的消息,而Stack Overflow不支持。 – 2010-02-16 15:37:40
PChar只是一個指向字符的指針,要發送一個字符串就像你需要先指向第一個字符,然後指定字符串數據的長度,這樣另一端就可以從開始點讀取數據直到字符串的長度。 如果您的DLL函數正在返回任何字符串值,那麼另一端應該提供一個內存空間,並將其起始地址和長度發送給您的函數,以便您的函數可以將輸出數據寫入該內存空間。 – vcldeveloper 2010-02-16 15:41:02
最好的方法是使用WideString。
有幾個原因。
在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進行編譯時(這取決於原始的開發系統是什麼),你會遇到異常。
這是一個社區,所以你不應該在你的問題中爲單個人解決問題。如果你想這樣做,他的答案寫評論。如果你寫一個問題(在這種情況下更好),儘量將其表述爲一般。 – jpfollenius 2010-02-16 13:41:04
同意。羅伯特吉塞克比我能做得更好。 – 2010-04-19 15:05:47