與 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;。主程序持有介面引用,引用計數自動管理生命週期,完全避免對象指針跨模塊問題。