gpt4 book ai didi

c# - 使用Delphi Dll和一些问题

转载 作者:行者123 更新时间:2023-12-01 23:42:40 25 4
gpt4 key购买 nike

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

最佳答案

您不能指望从 Delphi 以外的编程环境中调用该函数。这是因为它使用对互操作无效的 Delphi native 字符串。即使您从 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,但我怀疑您无法使用该选项。

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

关于c# - 使用Delphi Dll和一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19631722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com