You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi调用自制DLL无响应且无报错问题技术求助

解决Delphi调用DLL无反应的问题

我来帮你一步步排查这个问题,大概率是这几个细节没处理到位:

1. 调用约定不匹配(最核心的原因)

你在调用程序里给calc声明了stdcall调用约定,但DLL里的calc用的是Delphi默认的register调用约定——这俩的参数传递规则完全不同,会导致参数传递混乱,函数执行异常(甚至悄悄损坏栈),但可能不会触发明显报错,只是看起来“没反应”。

修复方法:
修改DLL中的函数代码,加上stdcall,同时确保函数被正确导出:

library my;

uses
  SysUtils, Classes;

{$R *.res}

// 给函数加上stdcall调用约定
function calc(b : integer;a:integer) : Integer; stdcall;
begin
  Result := a+b;
end;

// 必须在exports块里列出要导出的函数,否则外部程序找不到
exports
  calc;

begin
end.

重新编译DLL,替换到你之前放置的文件夹里。

2. 调用代码没处理返回值,导致“看起来没反应”

你可能只是调用了calc函数,但没有把计算结果输出出来(比如弹窗、控制台打印),所以即使函数正常执行,你也看不到任何效果。

修复方法:
在调用代码里添加结果输出逻辑,比如:

procedure TForm1.Button1Click(Sender: TObject);
function calc(b : integer;a:integer): Integer; stdcall; external 'my.dll';
var
  CalcResult: Integer;
begin
  CalcResult := calc(15, 25); // 传入测试参数
  ShowMessage('计算结果:' + IntToStr(CalcResult)); // 弹窗显示结果
end;

这样就能直观看到函数是否正常工作。

3. DLL路径的小坑(可能性较低,但可以排查)

虽然你把DLL放到了System32和exe目录,但Delphi IDE运行程序时,当前工作目录可能是项目根目录,而不是exe的输出目录(比如你的exe在Win32/Debug下,但IDE运行时默认工作目录是.dpr文件所在的文件夹)。

验证方法:
把DLL复制到你的项目根目录,再运行测试;或者直接在external声明里用绝对路径,比如:

function calc(b : integer;a:integer): Integer; stdcall; external 'C:\你的项目路径\my.dll';

额外排查小技巧

可以用Dependency Walker工具打开你的DLL,查看导出表,确认calc函数是否被正确导出,且导出名是_calc@8(stdcall调用约定会自动添加名字修饰,两个int参数共8字节)。如果导出名不对,说明调用约定还是没匹配上。

内容的提问来源于stack exchange,提问作者peiman F.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:46:49