DELPHI开发LINUX包
2024-08-26 09:24:29
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;
最新文章
- opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较
- Android 代码监控apk安装,卸载,替换
- javascript 笔记(1)
- Swift - 控制流/控制结构说明(if,switch,for,while)
- 【转载】__name__ == ";__main__";: 你认识我么?
- 【性能】web提升性能的小总结
- 【SSM之旅】Spring+SpringMVC+MyBatis+Bootstrap整合基础篇(一)项目简介及技术选型相关介绍
- Django 路由系统(URLconf)
- 三分钟了解Go语言的前世今生
- js 动态调用字符串方法并传入对应参数
- Redis 系列之CentOS下Redis的安装
- Django日志系统
- linux之vim配置及使用示例
- 使用 TXT 文本存储
- GlusterFS实战
- Style、ControlTemplate 和 DataTemplate 触发器
- Linux执行YUM命令报错解决方案
- 52.RocketMQ 事务
- torch 深度学习(3)
- Windows SDK 非模态对话框的消息处理
热门文章
- java常用集合框架关系
- jenkens docker启动
- Linux网卡上添加多个IP
- (critical) chassis-frontend.c:122: Failed to get log directory, please set by --log-path
- 用python实现数据库查询数据方法
- TLS 1.3 中Pre_shared_key和key_share对应的两种密钥交换模式
- springboot 使用常用注解
- 一个97年测试妹纸的成长经历,转正直接涨薪2K
- 基于k8s集群部署prometheus监控ingress nginx
- Mayor's posters (离散化线段树+对lazy的理解)