从C#调用Delphi DLL函数

zee*_*han 1 .net c# delphi pinvoke

这是Delphi函数头:

function CryptStr(str, Key : pchar; DecryptStr : boolean) : pchar; stdcall;
Run Code Online (Sandbox Code Playgroud)


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

请指导
谢谢

Dav*_*nan 5

假设PCharPAnsiChar:

[DllImport("Crypto.dll")]
static extern IntPtr CryptStr(string str, string Key, bool DecryptStr);
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

IntPtr retvalPtr = CryptStr(str, Key, DecryptStr);
string retval = Marshal.PtrToStringAnsi(retvalPtr);
Run Code Online (Sandbox Code Playgroud)

而且我希望你还需要调用DLL导出的函数来释放CryptStr返回指针后面的内存.你确实输出了我信任的功能吗?

如果PCharPWideChar那么它将是:

[DllImport("Crypto.dll", CharSet = CharSet.Unicode)]
static extern IntPtr CryptStr(string str, string Key, bool DecryptStr);
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

IntPtr retvalPtr = CryptStr(str, Key, DecryptStr);
string retval = Marshal.PtrToStringUni(retvalPtr);
Run Code Online (Sandbox Code Playgroud)

最后,如果你想要非常可爱,你可以安排Delphi代码使用COM分配返回值字符串CoTaskMemAlloc.如果你这样做,那么你可以避免手动编组,并让p/invoke marshaller执行释放.这看起来像这样.

[DllImport("Crypto.dll", CharSet = CharSet.Unicode)]
static extern string CryptStr(string str, string Key, bool DecryptStr);
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

string retval = CryptStr(str, Key, DecryptStr);
Run Code Online (Sandbox Code Playgroud)

现在应该很明显如何编码ANSI变体,因此我将省略它.

当您使用string返回值声明ap/invoke时,marshaller假定本机代码返回指向以null结尾的字符数组的指针.并且它还假设内存是从COM堆分配的,并调用CoTaskMemFree以释放内存.因此,这样做可以避免需要从DLL导出单独的deallocator函数.