c# - 从 C# 调用 Delphi DLL 函数

标签 c# .net delphi pinvoke

这是 Delphi 函数头:

function CryptStr(str, Key : pchar; DecryptStr : boolean) : pchar; stdcall;


如何从 C# 调用此函数。它实际上在一个名为 Crypto.dll 的 DLL 中

请指导
谢谢

最佳答案

假设PCharPAnsiChar:

[DllImport("Crypto.dll")]
static extern IntPtr CryptStr(string str, string Key, bool DecryptStr);

然后这样调用它:

IntPtr retvalPtr = CryptStr(str, Key, DecryptStr);
string retval = Marshal.PtrToStringAnsi(retvalPtr);

而且我希望您还需要调用 DLL 导出的函数,该函数释放 CryptStr 返回的指针后面的内存。你确实导出了我信任的这样的功能?

如果 PCharPWideChar 那么它将是:

[DllImport("Crypto.dll", CharSet = CharSet.Unicode)]
static extern IntPtr CryptStr(string str, string Key, bool DecryptStr);

然后这样调用它:

IntPtr retvalPtr = CryptStr(str, Key, DecryptStr);
string retval = Marshal.PtrToStringUni(retvalPtr);

最后,如果你想变得非常可爱,你可以安排 Delphi 代码使用 CoTaskMemAlloc 从 COM 堆分配返回值字符串。如果这样做,则可以避免手动编码,并让 p/invoke 编码器执行释放。看起来像这样。

[DllImport("Crypto.dll", CharSet = CharSet.Unicode)]
static extern string CryptStr(string str, string Key, bool DecryptStr);

然后这样调用它:

string retval = CryptStr(str, Key, DecryptStr);

现在应该很明显如何编写 ANSI 变体,所以我将省略它。

当您使用 string 返回值声明 p/invoke 时,编码器假定 native 代码返回一个指向以 null 结尾的字符数组的指针。它还假定内存是从 COM 堆中分配的,并调用 CoTaskMemFree 来释放内存。因此,这样做可以避免从 DLL 导出单独的释放器函数。

关于c# - 从 C# 调用 Delphi DLL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634580/

相关文章:

c# - 我在尝试获取当前位置时得到 NAN - 经度和纬度

delphi - dccosx fatal error

macos - Delphi - OSX - 从内存流加载字体

c# - 如何在 C# 中使用类的类型作为继承的集合属性的类型参数

c# - 使用NEST(ElasticSearch)搜索嵌套数组

.net - 在 Visual Studio 监 window 口中更改 DateTime 的默认显示

c# - Mongodb更新无意中插入文档

c# - Visual Studio C++ 和 C# 的异常报告组件

c# - 通过 HTML 敏捷包向 HTML 添加文档类型

c# - 格式化后奇怪的文本框插入符行为