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

标签 delphi delphi-7

我在 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/

相关文章:

delphi - 在项目中添加 .res 文件会替换默认图标。如何防止这种情况发生?

sql-server - 如何检查数据库是否存在?

delphi - 如何暂时禁用 "return value might be undefined"警告?

c++ - 在 C++Builder XE7 中使用 TChart

delphi - JPEG 数据流到 TImage

delphi - 限制 TControl 的比例

德尔福7到德尔福XE5

delphi - 如何实现FMX HD应用程序的放大和缩小?

multithreading - 为什么 TApplication.MessageBox 自动关闭?

delphi - 从指针复制数据?