使用Delphi Dll和一些问题

时间:2013-10-28 09:57:20

标签: c# delphi dll pinvoke

我想使用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,但仍然存在上述错误。

1 个答案:

答案 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,但我怀疑您无法使用该选项。

至于你的节目没有显示任何错误,我建议你参考这些帖子: