我想使用Delphi制作的dll。它有这个功能: function CryptStr(str,Key:AnsiString; DecryptStr:boolean):AnsiString; STDCALL;
我在/ bin / debug和应用程序根目录中复制了Dll。我的代码是:
[DllImport("Crypt2.dll", EntryPoint = "CryptStr", CallingConvention = CallingConvention.StdCall)]
static extern string CryptStr( string str, string Key, bool DecryptStr);
public string g = "";
private void Form1_Load(object sender, EventArgs e)
{
g=CryptStr("999", "999999", true);
MessageBox.Show(g);
}
我有一些问题: 1.即使我从那些路径应用程序中删除Dll也不会抛出未找到的异常 2.当应用程序在g = CryptStr(“999”,“999999”,true)中运行时;它完成执行并显示表单而不运行Messagebox行。 我试图使用Marshal,但仍然存在上述错误。
答案 0 :(得分:3)
您不能期望从Delphi以外的编程环境中调用该函数。那是因为它使用了对互操作无效的Delphi本地字符串。即使您从Delphi调用,您也需要使用与编译DLL相同的Delphi版本和ShareMem
单元,以便共享内存管理器。该功能甚至没有很好地设计用于两个Delphi模块之间的互操作。
您需要更改DLL函数的签名。例如,您可以使用:
procedure CryptStr(
str: PAnsiChar;
Key: PAnsiChar;
DecryptStr: boolean;
output: PAnsiChar;
); stdcall;
在C#中你会这样声明:
[DllImport("Crypt2.dll")]
static extern void CryptStr(
string str,
string Key,
bool DecryptStr,
StringBuilder output
);
此更改要求调用者分配传递给函数的缓冲区。如果要查找执行此操作的示例,请搜索调用Win32 API GetWindowText
的示例。
如果您使用的是UTF-16文本而不是8位ANSI,则可以使用在共享COM堆上分配的COM BSTR
,但我怀疑您无法使用该选项。
至于你的节目没有显示任何错误,我建议你参考这些帖子: