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中,
请指导
谢谢
假设PChar是PAnsiChar:
[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返回指针后面的内存.你确实输出了我信任的功能吗?
如果PChar是PWideChar那么它将是:
[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函数.