2012-08-12 89 views
2

所以我在這種情況下使用的IntPtr,如何將c#字符串傳遞給delphi .dll PChar類型?

-delphi(德爾福2006年版)的代碼瞭解到

function GetRequestResult(out code:integer):PChar; stdcall; 
    begin 
    LogMessage('GetRequestResult'); 
    code:=requestCode; 
    result:=PChar(RequestResult); 
    LogMessage('GetRequestResult done'); 
    end; 

然後,使用在C#中, 我一樣使用,

IntPtr str = GetRequestResult(out code); 
string loginResult = Marshal.PtrToStringAnsi(str); 

和這很好。

那麼,這種情況呢?

-delphi代碼

procedure Login(login,password:PChar); stdcall; 
... 
... 

這PChar類型是()內。 那麼傳遞字符串值到那個Login delphi函數的確切方法是什麼?

[的DllImport( 「ServerTool」)]

  1. 私人靜態外部空隙登錄([的MarshalAs(UnmanagedType.LPStr)]串ID,[的MarshalAs(UnmanagedType.LPStr)]串傳輸);

  2. private static extern void Login(IntPtr id,IntPtr pass); //在這種情況下,後期如何使用此IntPtr?

  3. private static extern void Login(string id,string pass);

在此先感謝。

+0

什麼德爾福版本?因爲這主要是一個C#問題,所以如果底層DLL是delphi 7 dll,那麼我建議你只能在stackoverflow中引用'PAnsiChar'(它始終等價於C中的char *'類型,不管Delphi版本如何) XE那麼上面列出的簽名會有兩個不同的含義。 – 2012-08-12 13:36:39

+0

嗨。 Delphi 2006 express – leegod 2012-08-12 22:08:00

回答

3

您的選項3是正確的方法。 p/invoke編組器將C#字符串映射到指向空終止字符數組(即PChar)的指針。默認的調用約定是stdcall,默認的字符集是Ansi,所以你不需要指定那些。

您的選項1也有效,但不必要的冗長,因爲您只是重新指定了默認編組。選項2也可以工作,但你只是爲自己創造額外的工作。一旦本機函數調用返回,您就有責任釋放IntPtr值。

相關問題