簡體   English   中英

本機DLL-C#

[英]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_CORRUPTIONNTSTATUS錯誤代碼。

您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM