1

这是德尔福函数头:

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


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

请指导
谢谢

4

1 回答 1

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. 如果你这样做了,那么你可以避免手动编组,并让 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 导出单独的释放器函数。

于 2013-10-28T12:21:27.010 回答