首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Delphi DLL 跨模塊傳遞 DataModule 導致二次調用崩潰的重複問題分析

     編輯:程式設計綜合問答

問題描述

與 ID 32728 相同:DLL 導出函數傳遞 TDataModule1 對象,首次調用正常,二次調用報 Read of address 00000008。

核心原因(再次強調)

Delphi 的 VCL 對象不支持跨模塊邊界直接傳遞。主程序與 DLL 各自維護類元數據、虛函數表、內存管理器。DLL 內部將主程序的對象指針賦值給全局變量 DataModule1,首次調用時主程序對象尚存活;二次調用時主程序可能已釋放/重建對象,或 DLL 內部對象狀態不一致,導致野指針訪問。

標準修復:傳遞連接字符串

// DLL 導出
function GetForm(ClassName, ConnStr: PChar): TFormClass; stdcall;
procedure InitDLL(ConnStr: PChar); stdcall;

// DLL 實現
procedure InitDLL(ConnStr: PChar); stdcall;
begin
  if not Assigned(DataModule1) then
    DataModule1 := TDataModule1.Create(nil);
  DataModule1.ADOCNT.ConnectionString := ConnStr;
  DataModule1.ADOCNT.Connected := True;
end;

// 主程序調用
InitDLL(PChar(Frm_DataModule.ADOCNT.ConnectionString));

進階封裝:介面工廠模式

定義純介面 IDataModule = interface ['{...}'] function GetConnection: TADOConnection; end;,DLL 實現並導出 function CreateDataModule(const ConnStr: WideString): IDataModule; stdcall;。主程序持有介面引用,引用計數自動管理生命週期,完全避免對象指針跨模塊問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved