delphi中的app-crash-on-call.dll

delphi中的app-crash-on-call.dll,delphi,dll,Delphi,Dll,我有一个用Delphi xe10.2包装的DLL,它包含一个函数 function calc(b : integer;a:integer) : Integer; begin Result := a+b; end; 我会在其他类似的节目中调用它 function calc(b : integer;a:integer): Integer; stdcall; external 'my.dll'; 我在System32文件夹和application.exe文件夹中复制了DLL procedure

我有一个用Delphi xe10.2包装的DLL,它包含一个函数

function calc(b : integer;a:integer) : Integer;
begin
  Result := a+b;
end;
我会在其他类似的节目中调用它

function calc(b : integer;a:integer): Integer; stdcall; external 'my.dll';
我在System32文件夹和application.exe文件夹中复制了DLL

procedure TForm1.Button1Click(Sender: TObject);
begin
 showmessage(inttostr(calc(2,3)));
end;
但当我从DelphiIDE运行时,什么也没发生。它不显示任何错误,也不显示应用程序主窗体


我怎么才能解决这个问题

System32是64位系统文件夹。您的应用程序是32位应用程序,因此不会在System32中搜索DLL。它将改为在SysWOW64中搜索,这是32位系统文件夹。如果在没有调试的情况下运行该程序,您将看到一条错误消息,告诉您无法找到DLL

现在,您不应该修改系统文件夹的内容。从System32中删除DLL,并将其放置在与可执行文件相同的目录中


给定显示的代码,另一个问题是导出的DLL函数使用
寄存器
调用约定,但您使用
stdcall
调用约定导入它。必须确保DLL和EXE使用的调用约定相互匹配。

System32是64位系统文件夹。您的应用程序是32位应用程序,因此不会在System32中搜索DLL。它将改为在SysWOW64中搜索,这是32位系统文件夹。如果在没有调试的情况下运行该程序,您将看到一条错误消息,告诉您无法找到DLL

现在,您不应该修改系统文件夹的内容。从System32中删除DLL,并将其放置在与可执行文件相同的目录中


给定显示的代码,另一个问题是导出的DLL函数使用
寄存器
调用约定,但您使用
stdcall
调用约定导入它。您必须确保DLL和EXE使用的调用约定相互匹配。

您不是用
stdcall
导出函数,而是用
register
导出函数。您不是用
stdcall
导出函数,而是用
register
。我将
stdcall
更改为
register
,然后从中删除
my.DLL
每一个地方,但没有任何改变,我也使用了
运行而不调试
,但它还没有显示任何错误!就我个人而言,我会在任何地方使用stdcall,因为除了delphi之外,其他工具都能理解它。将dll与可执行文件放在同一目录中。是你干的吗?然后直接运行可执行文件。给出建议是令人沮丧的,它似乎被忽略了。好吧,当我直接从可执行文件运行应用程序时,它可以工作,当我复制源目录上的dll时,它也可以从ide运行!!当我使用
stdcall
时,
calc
2和3的结果是81095,但当我将其更改为
register
时,函数返回5。您需要调用约定在两侧匹配。在DLL代码中使用
stdcall
,在可执行代码中使用
stdcall
。我将
stdcall
更改为
register
,然后从每个位置删除
my.DLL
,但没有任何更改,我还使用了
在不调试的情况下运行
,但它还没有显示任何错误!就我个人而言,我会在任何地方使用stdcall,因为除了delphi之外,其他工具都能理解它。将dll与可执行文件放在同一目录中。是你干的吗?然后直接运行可执行文件。给出建议是令人沮丧的,它似乎被忽略了。好吧,当我直接从可执行文件运行应用程序时,它可以工作,当我复制源目录上的dll时,它也可以从ide运行!!当我使用
stdcall
时,
calc
2和3的结果是81095,但当我将其更改为
register
时,函数返回5。您需要调用约定在两侧匹配。在DLL代码中使用
stdcall
,在可执行代码中使用
stdcall