这是Delphi函数头:
function CryptStr(str, Key : pchar; DecryptStr : boolean) : pchar; stdcall;
如何从C#调用此函数。它实际上在一个名为Crypto.dll的DLL内面
请指导
感谢
答案 0 :(得分:5)
假设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 marshaller执行释放。这看起来像这样。
[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时,marshaller假定本机代码返回指向以null结尾的字符数组的指针。并且它还假设内存是从COM堆分配的,并调用CoTaskMemFree
来释放内存。因此,这样做可以避免需要从DLL导出单独的deallocator函数。