使用Delphi Dll和一些问题

本文关键字:问题 Delphi Dll 使用 | 更新日期: 2023-09-27 18:37:17

我想使用Delphi制作的dll。它具有以下功能:函数 CryptStr(str, Key : AnsiString;DecryptStr : boolean) : AnsiString;标准呼叫;

我在/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) 中运行时;它完成执行并显示表单而不运行消息框行。我尝试使用元帅,但上述错误仍然存在。

使用Delphi Dll和一些问题

您不能期望从 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,但我怀疑该选项不可用。

至于您的程序没有显示任何错误,我建议您参考以下帖子:

  • http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/
  • http://blog.adamjcooper.com/2011/05/why-is-my-exception-being-swallowed-in.html
  • C# 中的静默失败,看似未经处理的异常,不会使程序崩溃