【发布时间】:2016-11-05 16:50:28
【问题描述】:
我有用 Delphi 编写的本地 DLL 库。我想从 C# 中引用这个库并得到返回的字符串。
功能
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)。
你有过期的吗?谢谢你的帮助
【问题讨论】:
-
1.在调试器下调用它时是否收到正确的异常消息? 2.函数是否导出? 3. 函数名有错吗? 4.你应该如何释放返回值?
-
1.不,应用程序以 NTSTATUS 错误代码结束。 2. 是的,否则会引发托管异常。 3. 见 2. 4. 非常好的问题!
-
@DavidHeffernan 你是对的,我应该先用谷歌搜索 0xc0000374。 (我想通过不在调试器下运行来确保 OP 不会错过托管异常)
-
@LucasTrzesniewski 4.) 如果您可以控制 DLL,您可以实现一个附加函数来释放该值。例如,
FreeCode函数(以指向字符串的指针作为参数)可以在 C# 代码完成对字符串的处理后调用(例如,将其复制到另一个变量)。 -
@quasoft 是的,这是一种方式。另一种方法是将缓冲区和大小传递给函数,以便它可以填充它。不过,您需要事先知道最大字符串长度。 P/Invoke 允许您为此提供
StringBuilder,您只需使用所需的容量对其进行初始化。