delphi的ARM架构支持与System.Win.WinRT库

这篇具有很好参考价值的文章主要介绍了delphi的ARM架构支持与System.Win.WinRT库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

delphi的ARM架构支持与System.Win.WinRT库

目录

delphi的ARM架构支持与System.Win.WinRT库

一、WinRT

二、delphi的System.Win.WinRT库

2.1、支持ARM芯片指令

2.2、基于WinRT技术的特点

2.3、所以使用默认库而未经转化的服务端应用并不支持ARM架构服务器

2.4、对默认库的调用经System.Win.WinRT类型转化后服务端应用应该可以支持ARM

2.5、服务端应用若不使用默认GUI图形用户界面应该也可以支持ARM服务器

三、服务端跨ARM

喜欢的,就收藏并点个赞,鼓励我继续技术的原创写作及经验分享:


        随着ARM架构云服务器的愈加火爆,delphi和C++ Builder在MSWindows平台下,有无简单实用的技术借鉴,值得研究。

一、WinRT

        是微软在win8时代,开始研发的专门用来支持ARM架构芯片的独立的操作系统(不单独售卖,只提供OEM或在自己的surface平板、移动设备等中分发)。2023年1月10日起结束支持。

Windows RT_百度百科

二、delphi的System.Win.WinRT库

       WinRT虽然是微软的一个失败项目,但其技术,仍然值得使用和借鉴。

2.1、支持ARM芯片指令

        通过调用WinApi.WinRT提供对基于WinRT的ARM芯片指令的支持。

2.2、基于WinRT技术的特点

        检索微软官网,会发现: 

delphi的ARM架构支持与System.Win.WinRT库

        不直接走“Win32”的API ,而是与Win32、.Net“并列”的一个架构,但“内核”同样是Winapi.Windows:

delphi的ARM架构支持与System.Win.WinRT库

 通讯:

delphi的ARM架构支持与System.Win.WinRT库

 

delphi的ARM架构支持与System.Win.WinRT库

 

  •        整数统一用HString类型的序数范围
  •                         Win32(0..4294967295):THandle = NativeUInt; //(0..2^32-1)
  •                         Win64(0..18446744073709551615):THandle = NativeUInt;//(0..2^64-1)
  •        字符串需要通过TWindowsString结构体和HString整数之间进行转化
  •        字节序列化范围支持:s1,s2,s3,s4,s5,s6,s7,s8,s9,s10及其子集
  •        WinRT类有其独立的签名,进行类的属性存储:WinRTClassNameAttribute.Signature;
  •                         签名不同,数据包的SizeOf内存空间就会是不同数值的字节
  •                         {$IF defined(LINUX) or defined(MACOS) or defined(ANDROID)}
  •                         Syetem.ModuleCacheID()得到的模块缓存的签名不同。因而不转化类型信息,跨ARM架构就一定出问题。
  •        所有WinRT运行时的类型信息及其上下文Context的导入基类及其帮助类:TWinRTImport、TWinRTImportHelper
  •        RO指令支持单线程和多线程       
  •        WinRT依赖的相关API:Winapi.WinrtMetadata(WinRT元数据RO指令)、Winapi.CorHdr(定义运行时结构、需要使用的元数据)、Winapi.CorError、Winapi.Cor(Windows内核)、Winapi.CommonNames(Windows API的通用命名)
  •        WinRT的全部注册表位置:Software\Microsoft\.NETFramework
  •                        由此可见,它在设置时,就被定义为.NETFramework下的子集;后续技术延续,取决于.NETFramework的技术延续

var
  RoInitType: RO_INIT_TYPE = RO_INIT_MULTITHREADED;

type
  RO_INIT_TYPE = (RO_INIT_SINGLETHREADED, RO_INIT_MULTITHREADED);

  /// <summary>Base Delphi object needed for Windows Runtime classes. Implements IInspectable interface</summary>
//Windows运行时类所需的基本Delphi对象。实现IInspectable接口:

  TInspectableObject = class(TInterfacedObject, IInspectable)
  protected
    FIIDS: array of TGUID;
  public
    /// <summary>Gets the interfaces that are implemented by the current Windows Runtime class</summary>
//获取由当前Windows运行时类实现的接口:
    function GetIids(out iidCount: Cardinal; out iids: PGUID): HRESULT; stdcall;
    /// <summary>Gets the fully qualified name of the current Windows Runtime object</summary>
//获取当前Windows运行时对象的规范命名空间:
    function GetRuntimeClassName(out className: HSTRING): HRESULT; stdcall;
    /// <summary>Gets the trust level of the current Windows Runtime object</summary>
//获取当前Windows运行时对象的信任级别:
    function GetTrustLevel(out trust: TrustLevel): HRESULT; stdcall;
  end;

  /// <summary>Helper needed to automate life cycle of HSTRING type and conversions from/to string</summary>
//自动化HSTRING类型的生命周期和(从/到)字符串的转换所需的助手

  TWindowsString = record
  strict private
  type
    TWindowsStringNexus = class(TInterfacedObject)
    private
      FString: HSTRING;
    public
      constructor Create(AString: HSTRING);
      destructor Destroy; override;
    end;

    PWindowsString = ^TWindowsString;
  private
    FNexus: IInterface;
    FHandle: HSTRING;
    FValid: Boolean;
  public
    constructor Create(const S: string); overload;
    /// <summary>Checks that the internal HSTRING was created successfully</summary>
//检查内部HSTRING是否已成功创建:
    property Valid: Boolean read FValid;

    class operator Implicit(const S: TWindowsString): HSTRING; inline;
    class operator Explicit(const S: string): TWindowsString;
    /// <summary>Gets the string representation of the given HSTRING</summary>
//获取给定HSTRING对应的字符串:
    class function HStringToString(const hs: HSTRING): string; static;
  end;


 

2.3、所以使用默认库而未经转化的服务应用并不支持ARM架构服务器

2.4、对默认库的调用经System.Win.WinRT类型转化后服务端应用应该可以支持ARM

        就类似FMX和VCL在相应的跨客户机平台上的受支持一样。

2.5、服务端应用若不使用默认GUI图形用户界面应该也可以支持ARM服务器

三、服务端跨ARM

       从上述分析,服务端的应用支持ARM架构芯片设备,基本可以得到的如下启发:

  • 只要服务器设备及其ARM芯片提供商,公开了指令集RO;RW、ZI

一个ARM程序包括三个段:RO,RW,ZI。

RO是指程序中的指令和常量:eg:指令如if else等,常量如 const char a = 0,#define AA 10等;
RW是程序中的已初始化的变量:eg:int a = 10;
ZI是程序中未初始化的变量:eg:int a;

这三点可以理解为:
RO就是read only;
RW就是read/write;
ZI就是zero initial;

  • 借鉴System.Win.WinRT库的处理方法成功导入指令集
  • 实现对整数和字符串类型的I/O的上述转化(参考System.Win.WinRT库的处理方法)

       理论上讲,就应该能够成功跨ARM,完成服务端应用的迁升,这种方法应该是“通用”的、不依赖任何三方库、语言版本的差异的。

喜欢的,就收藏并点个赞,鼓励我继续技术的原创写作及经验分享:

window及DOS专栏:
https://blog.csdn.net/pulledup/category_9605480.html
window专栏:
https://blog.csdn.net/pulledup/category_9299987.html文章来源地址https://www.toymoban.com/news/detail-489630.html

到了这里,关于delphi的ARM架构支持与System.Win.WinRT库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu22上使用qemu-system-arm调试linux

    qemu是用软件模拟硬件解析指令运行的软件,可以模拟arm、arm64、x86等,对于调试linux 内核机制很方便,不用额外购买开发板。由于linux上有对qemu的加速引擎,支持程度更高,且网络上教程居多,所以这里使用virtualbox+ubuntu22虚拟机,在ubuntu上运行qemu进行模拟。 virtualbox安装:

    2024年01月25日
    浏览(37)
  • vivado 设置综合synthesis支持system verilog

    在用vivado综合代码时,发现utilization资源利用率很少,查了一下各个模块的LUT使用情况,发现只有.v  ,而没有.sv文件。查了下原因主要是synthesis缺少了选项。 1、design sources中右键相关source files的属性选择type为SystemVerilog  2、右键synthesis,选择setting,在More Options选项处 加上指

    2024年02月12日
    浏览(57)
  • dpkg:package architecture (aarch64) does not match system (arm64)

    在nx平台下执行  root@root-desktop:~/test$ sudo dpkg -i MyTest_0.2.1.0_aarch64.deb  dpkg: error processing archive MyTest_0.2.1.0_aarch64.deb (--install):  package architecture (aarch64) does not match system (arm64) Errors were encountered while processing: MyTest_0.2.1.0_aarch64.deb root@root-desktop:~/test$ uname -a Linux rootdesktop 4.9.201-tegra

    2023年04月22日
    浏览(61)
  • 异常System.ComponentModel.Win32Exception (0x80004005)【已解决】

    在使用 C# Process 调用python.exe出现该异常, python.exe 位于D盘下,因此考虑可能是文件权限的原因。 win+r 打开运行窗口,输入 regedit ,点击确定; 点击 HKEY_USERS ; 点击编辑,然后点击权限; 选择 ereryone ,在完全控制和读取选择框打钩。 重启电脑即可。

    2024年02月11日
    浏览(25)
  • Win10蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

    终止代码:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED 失败的操作:mfehidk.sys 首先,针对上面的终止代码和失败的操作,联想官网给出的解答如下: 那就软件管家中卸载McAfee吧,反正已经很久不用了。 McAfee很容易卸载,但联想杀毒PLUS在系统程序、软件管家中都无法卸载,我下载了迈克菲卸

    2024年02月04日
    浏览(162)
  • Win11的两个实用技巧系列之电脑system占用高的解决办法

    Win11 system占用cpu过高是什么原因?Win11系统遇到system占用cpu很高,该怎么解决呢?下面我们就来看看Win11电脑system占用高的解决办法 System占用cpu过高导致电脑卡顿,这是有使用Win11系统用户遇到的问题,这篇文章是本站给大家带来的解决Win11system占用cpu过高问题方法。 方法一:

    2024年02月05日
    浏览(28)
  • Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统

    qemu-system-aarch64 启动的虚拟机,无法受到 kvm 的管理,也无法在后台运行 终端一旦断开了,虚拟机就被关掉了,想再次进入目前没找到方法,都会回到安装操作系统的步骤 可能是 centos 有某些特殊性吧,暂时没太多时间研究,后期有时间了再看看有没有解决的方案 qemu-5.2.0 和

    2024年02月06日
    浏览(40)
  • 使用 C++/WinRT 的集合

    在内部,Windows 运行时集合具有大量复杂的移动部件。 但要将集合对象传递到 Windows 运行时函数,或要实现自己的集合属性和集合类型时,C++/WinRT 中有函数和基类可以提供支持。 这 些功能消除复杂性,并节省大量时间和精力上的开销。 IVector 是由元素的任意随机访问集合

    2024年02月01日
    浏览(25)
  • 标准 C++ 数据类型和 C++/WinRT

    借助 C++/WinRT,可以使用标准 C++ 数据类型(包括某些 C++ 标准库数据类型)调用 Windows 运行时 API。 可以将标准字符串传递到 API(请参阅 C++/WinRT 中的字符串处理),还可以将初始值列表和标准容器传递到 API,这些 API 需要语义上等价的集合。 初始值列表 (std::initializer_list

    2024年01月17日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包