使用Delphi Dll和一些问题

2024-04-25

我想使用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 本机字符串。即使您从 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,则可以使用 COMBSTR它是在共享 COM 堆上分配的,但我怀疑您不可以使用该选项。

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

  • http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/ 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 http://blog.adamjcooper.com/2011/05/why-is-my-exception-being-swallowed-in.html
  • C# 中的静默故障,看似未处理的异常,不会导致程序崩溃 https://stackoverflow.com/questions/1583351/silent-failures-in-c-seemingly-unhandled-exceptions-that-does-not-crash-the-pr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Delphi Dll和一些问题 的相关文章

  • nUnit Assert.That委托并发问题

    我的代码中遇到了一些暂时的死锁 无法解决它 简单的代码 我无法创建一个简单的调用链来重现代码InvokeChangeEvent Test public async void Test sut InvokeChangeEvent foo fi
  • 使用正则表达式或其他解析从文件中读取值

    我有一个记录带有时间戳的值的文件 我必须在特定时间后读取特定值 例如 文件有 2013 03 03 19 08 22 car 2001 Ford 2013 03 03 19 08 27 Truck 2012 Chevy 2013 03 03
  • 为什么隐式类型转换没有警告?

    我终于发现了程序中的一个错误 该错误是由返回类型的隐式类型转换引起的 即使g Wall对此没有任何警告 我想知道是否有什么办法可以快速找出这种无意识的错误 include
  • fgetc,检查 EOF

    在书里Linux系统编程我读过一些这样的内容 fgetc返回读取为的字符unsigned char投射到int or EOF在文件末尾或错误 使用时的一个常见错误fgetc is char c if c fgetc EOF 该代码的正确版本
  • 如何通过 C# 检测字符串中的阿拉伯语或波斯语字符?

    我想检测Arabic or Persian字符串中的字符 例如 在字符串中搜索 15 Aspire ES1 533 C4UH 并返回true 并在字符串中搜索 Aspire ES1 533 C4UH 并返回false string patt
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 这些比较应该返回什么?

    我有一个使用 string compare string string 对某些值进行排序的应用程序 我不明白的是为什么 1022 比较小于 10 23 而 10 23 比较小于 1024 是否有特定于 值的东西导致了这个结果 string
  • 如何吞咽……有具体原因的异常

    在这个方法中 public static void Detach try using var master new DataContext Data Source LocalDB MSSQLLocalDB Initial Catalog m
  • 创建新视图时如何初始化视图模型中的属性?

    我有一个应用程序 可以打开一个视图 允许您搜索数据 然而 为了进行搜索 用户必须选择他想要在什么类别下进行搜索 目前 我正在尝试弄清楚如何将所选类别从主视图模型 作为 int 传递到新搜索视图的视图模型 目前我正在尝试在主视图中使用类似的东
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 如何保存具有多个缩进设置的XmlDocument?

    我需要保存一个XmlDocument以适当的缩进归档 Formatting Indented 但有些节点及其子节点必须排在一行 Formatting None 从那时起如何实现这一目标XmlTextWriter接受整个文档的设置 在 Ahm
  • 重复取消引用多个指针,效率较低?

    而不是写 string name first gt next gt next gt next gt name int age first gt next gt next gt next gt age 将其写为 node billy bloc
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • c++ string::size 中的 CharT 元素是什么?

    From http en cppreference com w cpp string basic string size http en cppreference com w cpp string basic string size 的数量
  • 指针 (*argv[]) 的指针的指针算术?

    我知道foo bar 等于 foo bar 但是什么是 foo bar 等于 例如访问 argv 2 我对这一点的理解有些困惑 我认为可能是这样的 foo bar 但我不确定 如果这是一个简单的答案 我深表歉意 a b 相当于 a b 由于
  • C# StreamReader 使用分隔符保存到数组

    我有一个文本文件 其中包含制表符分隔的数据 我在 C 应用程序中需要的是从文本文件中读取一行并将它们保存到一个数组中 在每个位置将它们分开 t 然后我对下一行做同样的事情 My code StreamReader sr new Stream
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • SQL 注入在 winform 中有效吗?

    我正在用 C 制作一个 Windows 软件 我读过关于sql injection但我没有发现它适用于我的应用程序 SQL 注入在 winform 中有效吗 如果是的话如何预防 EDIT 我正在使用文本框来读取用户名和密码 通过使用 tex
  • JSON.NET 序列化 JObject,同时忽略 null 属性

    我有一个JObject它被用作template用于调用 RESTful Web 服务 这JObject通过解析器创建 并且由于它用作模板告诉用户端点架构是什么样子 所以我必须找到一种方法来保留所有属性 这就是为什么我将它们的值默认为null

随机推荐

  • 使用“sprintf”将十六进制转换为字符串

    我正在尝试将数组转换为十六进制 然后将其放入字符串变量中 在下面的循环中 printf 工作正常 但我无法正确使用 sprintf 如何将十六进制值作为 ASCII 填充到数组中 static unsigned char digest 16
  • 未找到 Java 类 java.util.ArrayList...和 ​​MIME 媒体类型 text/xml 的消息正文编写器

    我使用 Jersey 构建 REST 服务并希望返回Collection
  • 打开新浏览器窗口的最佳方式是什么?

    我知道大多数链接应该留给最终用户来决定如何打开 但我们不能否认有时您几乎 必须 强制进入新窗口 例如以表单形式维护数据 在当前页面 我想知道的是关于在新浏览器窗口中打开链接的 最佳 方式的共识是什么 我知道 a href url targe
  • 如何将 .css 添加到 .cshtml

    我是一个完全的 HTML CSS 新手 我正在尝试获取 cshtml 文件来使用我编写的一些基本 CSS 我需要在 cshtml 中添加哪些代码才能使其使用 CSS 文件 编辑 这是我的 css 文件中的代码 它的目的是塑造我的风格divi
  • awk 计数频率

    嘿 我想统计 awk 中某一列的数据量 一个示例数据集是 2 5 8 1 3 7 8 5 9我想计算第二列中 5 的出现频率 这就是我尝试过的方法 但没有成功 total 0 for i 1 i lt NF i if i 2 if i 5
  • 推送通知未注册到 iOS 13 上的应用程序

    我构建了我的应用程序并在其中放置了一个断点didRegisterForRemoteNotificationsWithDeviceToken但它没有被触发 它在其他版本的 iOS 上运行良好 这是 iOS 13 中的错误还是我错过了 iOS
  • HTML:相对于图像的中心图像标题?

    我想编写 HTML 来对齐图像标题相对于图像的中心 我想对齐图片和标题在一起向左转 无论包含元素的宽度如何 这都应该是正确的 这是我到目前为止所拥有的 unknown containing element div style text al
  • Ubuntu DEB 安装程序使所有 Java 应用程序具有相同的图标

    我已经为基于 Debian 的系统创建了 Java 应用程序的 DEB 安装程序 在我的 DEB 包中 我使用 desktop 文件 如下所示 Desktop Entry Encoding UTF 8 Version version Typ
  • SAP JCo 使用 Java 在 SAP 系统中创建记录

    我正在尝试使用从 ABAP 获得的功能和结构在 SAP 系统中创建一个条目 我指的是这个链接在 SAP 中创建采购信息记录 https stackoverflow com questions 8534602 creating purchas
  • 收到“错误”:“未知的身份验证策略\“jwt \””

    我正在使用 Express Mongoose Passport 和 JWT 实现授权功能 我可以正常注册用户 我能够验证并生成 JWT 我可以在 JWT 站点上解析它 但由于某种原因 我收到未知的身份验证策略错误消息 我将所有代码块放在 P
  • 使用 pysam.TabixFile 注释读取的 Python 脚本中的处理速度振荡

    最初的问题 我正在用 python 3 5 编写一个生物信息学脚本 它解析一个大的 排序和索引的 bam https samtools github io hts specs SAMv1 pdf表示在基因组上对齐的测序读数的文件 将基因组信
  • Spring MVC 3.0 基本身份验证实现

    我目前正在使用 ASP NET 的 Spring MVC 框架将我的 Web 应用程序转换为 Java 不过学习它的好方法 我需要在我的应用程序中实现身份验证 请告诉我我的方法是否足够好和专业 以及如果不是 最好的做法是什么 首先 我正在编
  • TypeScript 传递导入 ES 库

    我想确保我的代码不使用比 ES6 更新的库功能 因此 我的tsconfig json看起来像这样 compilerOptions lib es6 target es6 outDir dist rootDir src module commo
  • 使用 st_buffer 围绕一个地理点画圈

    我想使用都柏林机场周围 110 NM 海里 绘制一个圆sf包裹 稍后我将通过st intersect带有来自 ADS B 的飞行位置报告 我为 NM 定义了一个新单位 如下所示 library units library tidyverse
  • mysql错误1064

    我正在尝试使用以下代码创建一个表 CREATE TABLE IF NOT EXISTS entries id int 10 NOT NULL auto increment atom id varchar 512 NOT NULL title
  • 是否可以在 docker hub 的自动构建中添加环境变量?

    我想自动化我的构建过程 并且需要传递一个环境变量来运行Dockerfile 我想知道在 Dockerhub 中是否有任何方法可以做到这一点 我知道 docker cloud 有类似的东西 但我想知道 Dockerhub 中是否有这个功能 因
  • Swift-Mailer 错误,“给定邮箱中的地址 [] 不符合 RFC”

    我构建了一个简单的 PHP 联系表单 该表单应该通过 Swiftmailer 脚本发送邮件 问题是我不断收到此错误 未捕获的异常 Swift RfcComplianceException 与 message 给定邮箱中的地址 不符合 RFC
  • MySQL C++ 连接器使用 SELECT 查询获取字符串

    我是 C 上的 mysql 新手 之前在 PAWN 上做过 效果很好 但现在我遇到了问题 我正在尝试从 mysql 数据库获取密码 稍后再执行其余代码 然后我会得到十六进制代码 如果是的话 这是我得到的示例 0x59fcb0 当我重新启动程
  • “缺少可链接的主机!”为设计

    我安装了 Devise 但每当我尝试创建帐户时 事情似乎都会停止 完整的错误如下 Missing host to link to Please provide host parameter or set default url option
  • 使用Delphi Dll和一些问题

    我想使用Delphi制作的dll 它有这个功能 函数 CryptStr str Key AnsiString DecryptStr boolean AnsiString 标准调用 我将 Dll 复制到 bin debug 和应用程序根目录中