• DELPHI开发LINUX包


    DELPHI开发LINUX包

    我们知道,有了包的存在,开发插件架构的程序,才成为可能 。

    DELPHI在WINDOWS里面的包的扩展名是.bpl。

    在LINUX里面的包的扩展名是.so。

    怎样在LINUX里面加载.so的包?

    不论加载WINDOWS的包,还是加载LINUX的包,都是使用LoadPackage()函数加载。

    function LoadPackage(const Name: string; AValidatePackage: TValidatePackageProc): HMODULE;
    {$IFDEF POSIX}
    var
      DLErrorMsg: string;
      M: TMarshaller;
    {$ENDIF POSIX}
    begin
    {$IFDEF MSWINDOWS}
      Result := SafeLoadLibrary(Name);
    {$ENDIF MSWINDOWS}
    {$IFDEF POSIX}
      Result := HMODULE(dlopen(M.AsAnsi(Name, CP_UTF8).ToPointer, PkgLoadingMode));
    {$ENDIF POSIX}
      if Result = 0 then
      begin
    {$IFDEF POSIX}
        DLErrorMsg := string(dlerror);
    {$ENDIF POSIX}
        raise EPackageError.CreateResFmt(@sErrorLoadingPackage,
          [Name,
           {$IFDEF MSWINDOWS}SysErrorMessage(GetLastError){$ENDIF MSWINDOWS}
           {$IFDEF POSIX}DLErrorMsg{$ENDIF POSIX}]);
      end;
      try
        InitializePackage(Result, AValidatePackage);
      except
    {$IFDEF MSWINDOWS}
        FreeLibrary(Result);
    {$ENDIF MSWINDOWS}
    {$IFDEF POSIX}
        dlclose(Result);
    {$ENDIF POSIX}
        raise;
      end;
    end;
    

     

    procedure UnloadPackage(Module: HMODULE);
    begin
      FinalizePackage(Module);
    {$IFDEF MSWINDOWS}
      FreeLibrary(Module);
    {$ENDIF MSWINDOWS}
    {$IFDEF POSIX}
      dlclose(Module);
      InvalidateModuleCache;
    {$ENDIF POSIX}
    end;
    

      

     

  • 相关阅读:
    httpclient5:信任所有证书,调用公众号接口
    驾驶技能考试系统:常见故障原因分析及排除
    C#:Combox实现key,value
    C#:密码框的两种方式
    C#:动态添加或删除控件,并根据控件名称获得控件
    微服务设计模式
    微服务设计模式
    微服务设计模式
    微服务设计模式
    微服务设计模式
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11290716.html
Copyright © 2020-2023  润新知