从C#调用Delphi DLL函数

时间:2013-10-28 12:15:58

标签: c# .net delphi pinvoke

这是Delphi函数头:

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


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

请指导
感谢

1 个答案:

答案 0 :(得分:5)

假设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 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函数。