我的编程空间,编程开发者的网络收藏夹
学习永远不晚

UEFI开发中用户交互界面如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

UEFI开发中用户交互界面如何使用

这篇文章主要介绍“UEFI开发中用户交互界面如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“UEFI开发中用户交互界面如何使用”文章能帮助大家解决问题。

作用

关于UNI文件的作用,在参考文档中做了如下的说明:

UEFI开发中用户交互界面如何使用

就是说,UNI提供了一系列的标记(Token)用来表示文本,这些文本可以有不同的实现(比如可以使用不同的语言,不同的编码格式),但是在代码调用中都可以使用统一的标记来表示。以之前在【UEFI实战】UEFI用户交互界面使用说明中的图示为例:

UEFI开发中用户交互界面如何使用

这里的Select Language就是一个在UNI文件中定义的标记(具体在FrontPageStrings.uni文件中):

UEFI开发中用户交互界面如何使用

可以看到,这里实际上支持两种语言,一种是英语一种是法语,所以我们的Front Page中可以进行切换:

UEFI开发中用户交互界面如何使用

而在我们的代码中,实际上使用的是STR_LANGUAGE_SELECT这个标记:

  HiiCreateOneOfOpCode (    StartOpCodeHandle,    FRONT_PAGE_KEY_LANGUAGE,    0,    0,    STRING_TOKEN (STR_LANGUAGE_SELECT),    STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),    EFI_IFR_FLAG_CALLBACK,    EFI_IFR_NUMERIC_SIZE_1,    OptionsOpCodeHandle,    NULL    );

至于具体如何切换,这里暂不深入。

语法

关于UNI文件中的语法,在参考文档中做了比较详细的说明(也有没说明白的地方)。但是因为使用了BNF的表示方法(包括BNF的扩展方法),所以初看起来还是有一些吃力,这里做简要的介绍。关于BNF以及它的扩展版本,可以通过链接查看,或者在其它的地方找到具体的使用说明。

基本定义

首先是一些需要了解的基本定义:

UNI文件中需要指明LanguageCodes,它是表示语言的标记,比如美式英语是en-US,法语是fr-FR,中文是zh-CN等等,它们在rfc4646中定义。

UNI文件中使用的字符串可以包含EscChar,全称是Escape Character,中文翻译是转义字符,基本听到中文名懂编程的都知道是什么意思了。

UNI文件中使用的标记可以包含数组,英文大小写,下划线(_)和折线(-)。UNI文件中可以包含其它的文件,使用include表达式。还有在UNI文件中会用到的基本表达式的BNF表示:

UEFI开发中用户交互界面如何使用

简单来说,::=左侧的是表达式,右侧是字符串定义。比如<US>这个表达式是最基本的,它就表示一个空格,它也会在::=的右侧用到,来组成更复杂的标记;比如<MS>,它的定义是<US>+,就表示多个空格;再比如<ME>,它的定义是<MS>{<EOL>},<EOL>表示的是End Of Line,所以<ME>表达式实际上就是多个空格组成的一行。

以此类推,构成了UNI(其实也是其它一切用BNF或者它的扩展版本表示的)文件的语法基础,正是上述的基本语法阐述了一个UNI文件应该如何实现。

语法说明

UNI文件的基本语法如下:

UEFI开发中用户交互界面如何使用

以一个实际的例子做对比:

UEFI开发中用户交互界面如何使用

这里就可以很明确的看到各个部分。不过上述例子中还有一部分没有包含进去,就是

/=#

它应该属于<Content>的一部分,称为ControlRefactor,不过目前不清楚它的作用,并且不是所有的UNI文件中都包含它,另外<LanguageDefs>也不是所有的UNI文件都包含,关于这些,在参考文档中并没有特别说明原因。

<CommentLine>和<LanguageDefs>两部分都比较简单,这里主要说明下<Content>,它的定义如下:

UEFI开发中用户交互界面如何使用

它也可以包含<CommentLine>,事实上注释可以出现在任何的位置,关于注释的表达式,在之前的基本定义中已经说明过,就是以//开头的行;

空白行也随时可以出现;

<UnicodeLines>是以#string开头的一个字符串(中间可以换行),它算是<Content>中最重要的部分,包含了真正用来定义并在其它文件中使用的标记;

<ControlRefactor>在前面的红色字体中已有说明,含义不明;

<LanguageDefs>也可以出现在<Content>中;

<SecurityLines>同样含义不明;

<IncludeLines>也在之前提到过,就是用来包含其它UNI文件的,像下面那样:

#include "MiscBaseBoardManufacturer.uni"#include "MiscBiosVendor.uni"#include "MiscChassisManufacturer.uni"#include "MiscOemString.uni"#include "MiscPortInternalConnectorDesignator.uni"#include "MiscSystemLanguageString.uni"#include "MiscSystemManufacturer.uni"#include "MiscSystemOptionString.uni"#include "MiscSystemSlotDesignation.uni"

上述<Content>的定义中,除了两个标红的不知道作用,最重要的就是<UnicodeLines>了,它的定义如下:

UEFI开发中用户交互界面如何使用

下面是一个具体的例子:

UEFI开发中用户交互界面如何使用

对于<FontId>没有找到具体的例子。这里说明下它的定义:

UEFI开发中用户交互界面如何使用

然后定义的Identifier就会被用在<UnicodeLines>中。

UNI文件的使用

本文的最后介绍下UNI文件的使用。

首先在C代码中要使用UNI文件,对应模块的INF文件中需要包含该文件,以Front Page对应的UiApp.inf为例:

UEFI开发中用户交互界面如何使用

在模块编译的过程中,编译工具(其实是Python脚本)将它们转换成对应的Unicode字节,放到AutoGen.c文件中的某个数组中。然后在C代码中要使用的话,需要先包含该UNI,使用的函数如下:

EFI_HII_HANDLEEFIAPIHiiAddPackages (  IN CONST EFI_GUID    *PackageListGuid,  IN       EFI_HANDLE  DeviceHandle  OPTIONAL,  ...  )

该函数将UNI文件提供的字符串最终放到HII数据库中,该HII数据库中还包含图像,窗体(Form),字体等内容。下面是一个具体的例子:

  //  // Publish our HII data  //  gFrontPagePrivate.HiiHandle = HiiAddPackages (                                  &mFrontPageGuid,                                  gFrontPagePrivate.DriverHandle,                                  FrontPageVfrBin,                                  UiAppStrings,                                  NULL                                  );

这里的UiAppStrings参数对应的就是UiApp.uni,对应关系是“BASE_NAME”+Strings对应到字符数组,这里的BASE_NAME的值来自inf。同时xxxStrings也是AutoGen.c中转换后得到的数组变量名。以上述的UiAppStrings为例(这里截取部分代码):

////Unicode String Pack Definition//unsigned char UiAppStrings[] = { // STRGATHER_OUTPUT_HEADER  0xB2,  0x03,  0x00,  0x00, // PACKAGE HEADER   0x7B,  0x01,  0x00,  0x04,  0x34,  0x00,  0x00,  0x00,  0x34,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,    0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x01,  0x00,  0x65,  0x6E,    0x2D,  0x55,  0x53,  0x00, // PACKAGE DATA // 0x0001: $PRINTABLE_LANGUAGE_NAME:0x0001  0x14,  0x45,  0x00,  0x6E,  0x00,  0x67,  0x00,  0x6C,  0x00,  0x69,  0x00,  0x73,  0x00,  0x68,  0x00,  0x00,    0x00,

在UiApp.uni中定义的第一个标记是:

UEFI开发中用户交互界面如何使用

在上述的字节中(PACKAGE DATA部分),第一个0x14有其它的含义(见EFI_HII_SIBT_STRING_UCS2),后面的每两个字节就表示一个Unicode字符的英文或者法文(上图是英文,法文在数组的后面,这里没有列出),可以看到0x0045表示的是Unicode的E,0x006E表示的是Unicode的n(具体的转换可以看这里),以此类推。

之后就可以通过对应的GUID使用到定义在UNI中的标记了,使用的方式是

STRING_TOKEN (标记)

这里的标记最终会被定义成一个宏,放到跟AutoGen.c同一层目录下的xxxStrDefs.h文件中,这里的xxx就是模块的名称。这个STRING_TOKEN(标记)会被当成一个宏,对应到一个整数,通过这个整数可以找到上述数组中对应Unicode字符串的位置。这个宏最终会被EFI_HII_STRING_PROTOCOL中的GetString()函数使用并解析成字符串:

typedefEFI_STATUS(EFIAPI *EFI_HII_GET_STRING)(  IN CONST  EFI_HII_STRING_PROTOCOL *This,  IN CONST  CHAR8                   *Language,  IN        EFI_HII_HANDLE          PackageList,  IN        EFI_STRING_ID           StringId,  OUT       EFI_STRING              String,  IN OUT    UINTN                   *StringSize,  OUT       EFI_FONT_INFO           **StringFontInfo OPTIONAL);

关于“UEFI开发中用户交互界面如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

UEFI开发中用户交互界面如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

UEFI开发中用户交互界面如何使用

这篇文章主要介绍“UEFI开发中用户交互界面如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“UEFI开发中用户交互界面如何使用”文章能帮助大家解决问题。作用关于UNI文件的作用,在参考文档中做
2023-06-30

UEFI开发用户交互界面实例分析

这篇“UEFI开发用户交互界面实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“UEFI开发用户交互界面实例分析”文章吧
2023-06-30

Android用户界面开发之:TextView的使用实例

TextView就是一个用来显示文本标签的控件。代码如下: textview = (TextView)this.findViewById(R.id.textvie
2022-06-06

如何使用jQuery UI库开发Web界面

这篇文章主要讲解了“如何使用jQuery UI库开发Web界面”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用jQuery UI库开发Web界面”吧!一.jQuery UIjQuery
2023-07-04

UEFI开发基础汇编代码如何使用

这篇文章主要讲解了“UEFI开发基础汇编代码如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“UEFI开发基础汇编代码如何使用”吧!UEFI中使用汇编代码EDK代码中包含一部分汇编代码,
2023-06-30

如何使用C++进行图形界面开发?

如何使用C++进行图形界面开发?一、背景介绍随着计算机技术的不断发展,图形界面已经成为了现代软件开发的重要组成部分。在图形界面开发中,C++是一种广泛使用的编程语言,它拥有高性能和可移植性的特点,很适合用于开发复杂的图形应用程序。二、选择图
如何使用C++进行图形界面开发?
2023-11-02

C#开发中如何使用WPF和WinForms进行界面设计

C#开发中如何使用WPF和WinForms进行界面设计引言:在C#开发中,界面设计是一个重要的环节。有多种界面设计工具和框架可供选择,比如Windows Presentation Foundation(WPF)和Windows Forms(
2023-10-22

C++跨平台开发:如何处理不同平台的GUI和用户交互?

c++++跨平台开发可以通过qt框架实现跨平台gui,它提供了跨平台api,允许使用统一的代码创建windows、macos和linux平台上的应用程序。对于需要平台特定功能的情况,可以使用平台特定的代码,并通过事件处理管理用户交互,例如处
C++跨平台开发:如何处理不同平台的GUI和用户交互?
2024-05-10

小程序开发中如何调起客户端扫码界面

这篇文章主要为大家展示了小程序开发中如何调起客户端扫码界面,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“小程序开发中如何调起客户端扫码界面”这篇文章吧。调起客户端扫码界面,扫码成功后返回对应的结果
2023-06-26

C++如何支持嵌入式系统的图形和用户界面开发?

c++++通过提供一系列gui库(如qt、wxwidgets)支持嵌入式系统gui开发。这些库确保实时响应、低内存占用、代码可重用性和可移植性。实战案例展示了c++在创建嵌入式仪表板仪表中的使用,包括设置gui和主函数。C++如何增强嵌入式
C++如何支持嵌入式系统的图形和用户界面开发?
2024-05-12

win10开机卡在用户登录界面如何解决

如果您的Windows 10开机卡在用户登录界面,请尝试以下解决方法:重启电脑:有时候只需简单地重新启动电脑就可以解决问题。按住电源按钮关机,然后再次启动电脑。检查键盘和鼠标连接:确保键盘和鼠标正确连接到电脑上。如果使用无线设备,请确认电池
win10开机卡在用户登录界面如何解决
2024-02-29

win7系统开机界面的用户名如何修改

  win7系统开机界面的用户名如何修改?我们电脑设置了密码之后,在开机的页面中就会显示我们的用户名。如果你有多个账户,上面就会显示你不同账户的名称。那么我们需要修改这个名称的时候,要怎么去进行设置,很多小伙伴不知道怎么详细操作,小编下面整
2023-07-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录