gpt4 book ai didi

Delphi:调用 dll 中的过程后出现访问冲突

转载 作者:行者123 更新时间:2023-12-03 15:07:44 25 4
gpt4 key购买 nike

我在 dll 中创建了一个过程,它打开一个表单,然后打印一个报告。此过程在 exe 中完美运行。我已将包含此过程和表单的单元包装在 dll 中,并导出该过程,如下所示:

{$R *.res}


Procedure PrintTopSellers; stdcall;
begin
Form1 := TForm1.create(nil);
GetMonth := TGetMonth.create(nil);
Form1.PrintTopSellers;
end;


exports PrintTopSellers;

begin
end.

现在我从 exe 中将此过程称为 PrintTopSellers,如下所示:

procedure TForm1.Button5Click(Sender: TObject);
type
TRead_iButton = function :integer;
var
DLL_Handle: THandle;
Read_iButton: TRead_iButton;
Begin
DLL_Handle := LoadLibrary('c:\Catalog.dll');
if DLL_Handle <> 0 then
begin
@Read_iButton:= GetProcAddress(DLL_Handle, 'PrintTopSellers');
Read_iButton;
end;
application.ProcessMessages;
FreeLibrary(DLL_Handle);

end;

对过程的调用工作完美。但是,在关闭调用 exe 后,我收到访问冲突 - “地址 00BAC89C 处发生访问冲突。读取地址 00BAC89C。”

感谢任何帮助。我正在使用德尔福7。谢谢

最佳答案

您正在 DLL 中创建一个窗口控件 Form1。但你永远不会摧毁它。然后卸载 DLL,从而卸载为 DLL 创建的所有窗口实现窗口过程的代码。大概当进程关闭时,窗口过程被调用,但那里不再有代码了。

通过销毁 DLL 创建的所有对象来解决该问题。在我看来,最好的方法是在 PrintTopSellers 终止时执行此操作。

Procedure PrintTopSellers; stdcall;
begin
Form1 := TForm1.create(nil);
try
GetMonth := TGetMonth.create(nil);
try
Form1.PrintTopSellers;
finally
GetMonth.Free;
end;
finally
Form1.Free;
end;
end;

在加载 DLL 的代码中,TRead_iButton 声明不正确。应该是

TRead_iButton = procedure; stdcall;

但这实际上并不能解释这里的问题,因为签名不匹配对于无参数过程来说是良性的。

关于Delphi:调用 dll 中的过程后出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12510783/

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