2011-03-15 57 views
3

我有問題從C#調用delphi函數(試圖讀取或寫入受保護的內存),並想知道調用方法的正確方法應該是什麼。 Delphi函數簽名如下:如何從C#中調用這個Delphi函數?

procedure methodToCall(
    aFirstParameter: Widestring; 
    var aSecondParameter: Widestring 
    ); stdcall; 

從C#中調用此方法的正確方法是什麼?

+0

嗨,你是如何在C#中調用這個?與DllImport或與COM互操作性?你添加了參考嗎?我們可以看到C#方面嗎? – 2011-03-15 09:52:07

回答

7

的WideString的是兼容COM BSTR等等.NET編組應該能夠很愉快地使用它:

[DllImport(@"test.dll")] 
private static extern void methodToCall(
    [MarshalAs(UnmanagedType.BStr)] 
    string aFirstParameter, 
    [MarshalAs(UnmanagedType.BStr)] 
    ref string aSecondParameter 
); 
+0

如果我使用[MarshalAs(UnmanagedType.LPStr)] StringBuilder firstParameter會發生什麼? – 2011-03-15 10:31:15

+0

因爲Delphi代碼被寫入來接收WideString(又名BSTR)而不是LPStr,會出現什麼問題。我只寫了一個DLL來測試這個,上面的C#代碼完美地工作。 – 2011-03-15 10:34:48

+0

你是否有一個Delphi WideStrings和BSTR相同的源代碼? – CodesInChaos 2011-03-15 10:37:08