DELPHI开发LINUX包
我们知道,有了包的存在,开发插件架构的程序,才成为可能 。
DELPHI在WINDOWS里面的包的扩展名是.bpl。
在LINUX里面的包的扩展名是.so。
怎样在LINUX里面加载.so的包?
不论加载WINDOWS的包,还是加载LINUX的包,都是使用LoadPackage()函数加载。
1function LoadPackage(const Name: string; AValidatePackage: TValidatePackageProc): HMODULE; 2{$IFDEF POSIX} 3var 4 DLErrorMsg: string; 5 M: TMarshaller; 6{$ENDIF POSIX} 7begin 8{$IFDEF MSWINDOWS} 9 Result := SafeLoadLibrary(Name); 10{$ENDIF MSWINDOWS} 11{$IFDEF POSIX} 12 Result := HMODULE(dlopen(M.AsAnsi(Name, CP_UTF8).ToPointer, PkgLoadingMode)); 13{$ENDIF POSIX} 14 if Result = 0 then 15 begin 16{$IFDEF POSIX} 17 DLErrorMsg := string(dlerror); 18{$ENDIF POSIX} 19 raise EPackageError.CreateResFmt(@sErrorLoadingPackage, 20 [Name, 21 {$IFDEF MSWINDOWS}SysErrorMessage(GetLastError){$ENDIF MSWINDOWS} 22 {$IFDEF POSIX}DLErrorMsg{$ENDIF POSIX}]); 23 end; 24 try 25 InitializePackage(Result, AValidatePackage); 26 except 27{$IFDEF MSWINDOWS} 28 FreeLibrary(Result); 29{$ENDIF MSWINDOWS} 30{$IFDEF POSIX} 31 dlclose(Result); 32{$ENDIF POSIX} 33 raise; 34 end; 35end; 36 37procedure UnloadPackage(Module: HMODULE); 38begin 39 FinalizePackage(Module); 40{$IFDEF MSWINDOWS} 41 FreeLibrary(Module); 42{$ENDIF MSWINDOWS} 43{$IFDEF POSIX} 44 dlclose(Module); 45 InvalidateModuleCache; 46{$ENDIF POSIX} 47end;