这是 Delphi 函数头:
function CryptStr(str, Key : pchar; DecryptStr : boolean) : pchar; stdcall;
如何从 C# 调用此函数。它实际上在一个名为 Crypto.dll 的 DLL 中
请指导
谢谢
最佳答案
假设PChar
是PAnsiChar
:
[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
返回的指针后面的内存。你确实导出了我信任的这样的功能?
如果 PChar
是 PWideChar
那么它将是:
[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/