【问题标题】:Use Delphi Dll and some problems使用Delphi Dll和一些问题
【发布时间】:2013-10-28 09:57:20
【问题描述】:

我想使用 Delphi 制作的 dll。它有这个功能: 函数 CryptStr(str, Key : AnsiString; DecryptStr : boolean) : AnsiString;标准调用;

我将 Dll 复制到 /bin/debug 和应用程序根目录中。我的代码是:

 [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,但仍然存在上述错误。

【问题讨论】:

  • Form 吞下 Load 事件中的任何异常。您需要在事件中自己处理。所以添加一个适当的 try..catch。

标签: c# delphi dll pinvoke


【解决方案1】:

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

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

【讨论】:

  • 我认为他也可以使用 BSTR/WideString 甚至 OLE TStrings 适配器进行互操作。我猜 C# 支持 BSTR DLL API 吗?
  • @Arioch'[MarshalAs(UnmanagedType.BStr)],但问题是BSTR是UTF-16,原码是ANSI。所以这是一个编码问题,而不是编组的可能性。
  • 通过将声明更改为使用WideString,可以自动进行转换。 PS:我只是对一般用途的标记终止字符串使用有偏见:-)
  • @Arioch'The 要保持相同的行为,您必须将与 8 位的转换移动到 Delphi 代码中,而不是由编组器完成。
  • @Arioch'The Well,只要将两个输入字符串分配给函数顶部的AnsiString 变量即可。 FWIW,看看我对这个令人毛骨悚然的类似问题的回答的 cmets:stackoverflow.com/questions/19634580/… 所以,谁知道这个 DLL 到底是什么!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多