这是德尔福函数头:
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
. 如果你这样做了,那么你可以避免手动编组,并让 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 变体,所以我将省略它。
当您使用返回值声明 ap/invoke 时string
,编组器假定本机代码返回指向以空字符结尾的字符数组的指针。它还假设内存是在 COM 堆外分配的,并调用CoTaskMemFree
以释放内存。因此,这样做可以避免需要从 DLL 导出单独的释放器函数。