[英]Native DLL - C#
我有用Delphi寫的本機DLL庫。 我想從C#引用此lib並獲取返回的字符串。
功能
function GetCode (aUser,aPassword: PAnsiChar): PAnsiChar; stdcall;
C#代碼
[DllImport("C:\\library.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
private static extern String GetCode([MarshalAs(UnmanagedType.LPStr)]string aUser, [MarshalAs(UnmanagedType.LPStr)]string aPassword);
public String getCode(String login, String password) {
return GetCode(login, password);
}
嘗試調用功能應用程序退出,代碼為-1073740940(0xc0000374)。
你有過期嗎? 謝謝你的幫助
如果返回值為string
,則編組將負責釋放返回的字符串。 它通過調用CoTaskMemFree
。 毫無疑問,您的字符串沒有分配到COM堆上。 因此,該錯誤是STATUS_HEAP_CORRUPTION
的NTSTATUS
錯誤代碼。
您的p /調用應該返回一個IntPtr
來避免這種情況:
[DllImport("C:\\library.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
private static extern IntPtr GetCode(string aUser, string aPassword);
要獲取字符串,請將返回值傳遞給Marshal.PtrToStringAnsi
。
public string getCode(string login, string password)
{
IntPtr retval = GetCode(login, password);
string result = Marshal.PtrToStringAnsi(retval);
// how do we deallocate retval
return result;
}
還要注意,我刪除了多余的MarshalAs
屬性。 CharSet.Ansi
處理輸入參數的編組。
您仍然需要弄清楚如何取消分配返回的內存。 我們無法確定它是如何分配的。 您需要聯系Delphi代碼的開發人員,或閱讀源代碼。 如果使用了本機的Delphi堆,請不要感到驚訝,這會使您陷入困境。 通過調用CoTaskMemAlloc
使用COM堆實際上不是一個壞選擇,然后原始的p / invoke返回string
值就可以了。
其他選項包括導出解除分配器或要求調用方分配緩沖區。 網絡上有很多有關如何實現各種選項的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.