主程序調用 DLL 顯示窗體,首次正常;關閉窗體後再次調用,報 Read of address 00000008(Access Violation)。
DLL 導出函數 GetForm 和 InitDLL 參數為 TDataModule1 對象指針:
function GetForm(ClassName: PChar; DM: TDataModule1): TFormClass; stdcall;
procedure InitDLL(DM: TDataModule1); stdcall;
跨模塊傳遞 VCL 對象指針是未定義行為:主程序與 DLL 各自擁有獨立的 VCL 運行時、堆管理器、類表。對象內部的虛函數表指針、引用計數在模塊邊界失效,導致二次使用時訪問野指針。
ConnectionString: PChar。TADOConnection 並 ConnectionString := ConnectionString。Frm_DataModule.ADOCNT.ConnectionString。function GetForm(ClassName, ConnStr: PChar): TFormClass; stdcall;
procedure InitDLL(ConnStr: PChar); stdcall;
ShareMem 單元(使用 borlndmm.dll),但強烈不推薦,維護成本極高。IDataAccess,DLL 實現並導出工廠函數返回介面,主程序僅持有介面引用,跨模塊安全。Action := caFree,確保釋放;主程序 FreeLibrary 前確保所有 DLL 對象已釋放。