Delphi 跨平台_delphi调用api接口

Delphi 跨平台_delphi调用api接口DELPHI是怎么实现跨平台的?

大家好,又见面了,我是你们的朋友全栈君。

DELPHI是怎么实现跨平台的?

首先跨平台必须要兼容原来的语法,以线程的临界区对象为例:

TCriticalSection = class(TSynchroObject)
{$IFDEF POSIX}
private type
TCritSec = record
FSync: TObject;
procedure Initialize; inline;
procedure Free; inline;
procedure Enter; inline;
procedure Leave; inline;
function TryEnter: Boolean; inline;
end;
{$ENDIF POSIX}
protected
{$IFDEF MSWINDOWS}
FSection: TRTLCriticalSection;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
FSection: TCritSec;
{$ENDIF POSIX}
public
constructor Create;
destructor Destroy; override;
procedure Acquire; override;
procedure Release; override;
function TryEnter: Boolean;
procedure Enter; inline;
procedure Leave; inline;
end;

可以看出,已经不单是原来的从WINDOWS OS临界封装,通过{$IFDEF POSIX}跨平台编译开关,增加了跨平台的封装。

 

下面再以线程类TThread为例:

TThread = class
private type
PSynchronizeRecord = ^TSynchronizeRecord;
TSynchronizeRecord = record
FThread: TObject;
FMethod: TThreadMethod;
FProcedure: TThreadProcedure;
FSynchronizeException: TObject;
end;
private class var
FProcessorCount: Integer;
private
FThreadID: TThreadID;
{$IF Defined(MSWINDOWS)}
FHandle: THandle platform;
{$ELSEIF Defined(POSIX)}
FCreateSuspendedMutex: pthread_mutex_t;
FInitialSuspendDone: Boolean;
{$ENDIF POSIX}
FStarted: Boolean;
FCreateSuspended: Boolean;
FTerminated: Boolean;
FSuspended: Boolean;
FFreeOnTerminate: Boolean;
FFinished: Boolean;
FReturnValue: Integer;

。。。。。。

也和临界区类一样用跨平台编译开关封装了跨平台代码进来。

从上面的2个例子可以看出,DELPHI为了跨平台,对RTL进行了艰苦卓绝的巨大修改,这个工程无疑是浩大的。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107081.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux下如何启动ice服务器,Linux下ICE的安装[通俗易懂]

    linux下如何启动ice服务器,Linux下ICE的安装[通俗易懂]ICE在Linux下的完整编译安装安装平台要求:最好用gcc4.x版编译ICE,在Slackware下发现gcc3.3.6和gcc3.4.6都无法编译通过为了方便管理,将ICE相关的软件都安装到/usr/local/ICE-3.3.0/目录下首先安装第三方包:ThirdParty-Sources-3.3.0.tar.gz解压ThirdParty-Sources-3.3.0.tar.gz#c…

  • ideaIU-2021.4激活码【在线破解激活】

    ideaIU-2021.4激活码【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • tar 打包压缩命令

    tar 打包压缩命令tar命令用于文件的打包或压缩,是最为常用的打包压缩命令,其语法格式如下:tar[选项]文件名.tar.gz源文件tar-cvfzxxx.tar.gzsource_file(tar-cvfz包名.tar.gz源文件)#以tar.gz方式打包并gz方式压缩tar-xvfzxxx.tar.gz-Cpath(tar-xvfzxxx.tar.gz-C目标路径)#解压缩包注意:使用tar命令,打包仅仅是打包xxx.tar,打包

  • c++的发展方向

    c++的发展方向我现在是一名在校大学生,在学校期间自学C++有两年的时间了,看过C++Primer,stl,insideC++model(侯捷翻译的那本),com本质论等… 在学习C++的过程中感觉C++语言本身的确很强大,而且随着学习的深入,我逐渐感到要想在短时间了解这门语言的本质几乎是不可能的.因为我也学习过javaSE的一些东西,感觉就java和C#来说,语言本身不难,不过在底层调用方面有时候就

  • HashMap currentHashMap总结

    HashMap currentHashMap总结HashMap不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩容后数据存储位置的计算方式也不一样:1.在JDK1.7的时候是直接用hash值和需要扩…

  • c#中executeNonQuery执行异常怎么处理_getchar的返回值

    c#中executeNonQuery执行异常怎么处理_getchar的返回值SqlCommand.ExecuteNonQuery方法对连接执行Transact-SQL语句并返回受影响的行数。备注: 可以使用ExecuteNonQuery来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行UPDATE、INSERT或DELETE语句,在不使用DataSet的情况下更改数据库中的数据。     虽然ExecuteNonQuer

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号