Delphi 中.dproj 文件解析(二、详细解析)

news2024/11/17 8:30:04

上一篇 介绍了Delphi 的各个版本,本文开始分析.dproj文件。.dproj是一个XML文件,里边包含了我们在Delphi开发环境中对项目设置的所有参数(位于IDE:Project -> Options 中),包括并不限于:

  1. 版本信息;

  1. 图标信息;

  1. 编译生成的目标文件存放路径;

  1. 编译目标平台(windows,android,ios, .....);

  1. 配置信息(Debug,Release)

.....

由于官方没有提供任何关于.dproj文档的说明,本文是根据Delphi 各个项目对比分析的结果,如有任何疏漏甚至错误,欢迎交流指正!所有分析基于Delphi 11.2

对于.dproj 官方并没有给出任何文档介绍,那么为什么要分析研究.dproj文件呢,目的就是想实现delphi程序的自动构建,自动构建,自动构建

由于.dproj涉及的项目参数非常多,对于自动构建,我们只需要上面的5个参数信息就可以,其他的参数都使用项目原来的。

一、.dproj 文件结构

下面是一个缩减了的.dproj 文件结构框架:

//整体使用 Project 节点,所有内容在这个节点中
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    //第一个 PropertyGroup 节点,不包含任何 Attributes 属性,包含框架VCL/FMX、配置Relase/Debug、平台Win32/Win64/Andoird...、程序类型Application/Dll等主要信息
    <PropertyGroup> 
        <ProjectGuid>{A524FB1B-A9A8-4FB6-A680-1D05B7B5E1BF}</ProjectGuid>
        <ProjectVersion>19.5</ProjectVersion>
        <FrameworkType>VCL</FrameworkType>
        <Base>True</Base>
        <Config Condition="'$(Config)'==''">Release</Config>
        <Platform Condition="'$(Platform)'==''">Win64</Platform>
        <TargetedPlatforms>3</TargetedPlatforms>
        <AppType>Application</AppType>
        <MainSource>VCL_DEMO.dpr</MainSource>
    </PropertyGroup>
    
    //随后包含n个PropertyGroup节点,含有不同Condition属性(Attributes),包含程序的版本,图标等信息
    <PropertyGroup Condition="xxx">
        ...
    </PropertyGroup>

    ....

    //包含一个ItemGroup节点,定义一些本工程需要的属性参数,例如Cfg_1对应Debug,Cfg_2对应Release
    <ItemGroup>
        ...
    </ItemGroup>
    
    //包含一个ProjectExtensions节点,内有n多项目参数节点
    <ProjectExtensions>
        ...
    </ProjectExtensions>
    
    //包含n个Import节点,定义项目需要的一些文件
    <Import Project=" xxx "/>

</Project>

二、.dproj 文件分析

1). 通用参数节点

第一个 <PropertyGroup> 节点,包含有项目的通用设置参数。这个节点特点是:

  1. 该节点是整个项目节点 <Project>的第一个子节点;

  1. 该节点是唯一没有包含任何 Attributes 属性的<PropertyGroup> 节点;

  1. 是唯一包含<ProjectGuid>子节点的节点;

序号

子节点

含义

1

<ProjectGuid>

包含Delphi项目的Guid,每个项目是唯一的,如果在一个项目组中,出现两个ProjectGuid 一样,系统会提示,要求一个项目必须更改。正常情况,Delphi开发环境IDE创建的项目会自动生成这个节点内容,并且保证每个项目是唯一的。

2

<ProjectVersion>

表示Delphi的版本,和实际Delphi的发行版本是不一样的。例如上面样例数据为19.5,就表示是Delphi 11.2版本开发的。具体的版本对应关系请参见.dproj 版本对应表 。

3

<FrameworkType>

表示Delphi项目框架,值是 VCLFMX或者None(dll和控制台程序该值为None)。

4

<Base>

表示.dproj文件中是否使用 Base 参数,默认是True,表示使用。该参数不要修改!

5

<Config>

表示Delphi项目中的Build Configurations 配置。Debug或者Release

6

<Platform>

表示Delphi项目的目标平台。

对应的参数值:Android、Android64、iOSDevice64、iOSSimARM64、Linux64、OSX64、OSXARM64、Win32、Win64

7

<AppType>

表示是应用程序还是控制台程序或者是DLL等。参数值如下:

  1. Application : 普通的程序(Exe、Apk等)

  1. Library : DLL动态链接库

  1. Console :控制台程序

  1. Package : 表示包项目,例如控件等

8

<MainSource>

工程文件名称,主工程源文件名称,后缀.dpr。对于包项目,没有这个节点。

2). <ItemGroup>节点说明

该节点定义整个项目中使用的源文件,项目Debug和Release的宏变量定义。

序号

子节点

含义

1

<DCCReference>

定义本工程中需要的源文件,每个源文件对应一个这样的节点,该节点内包含不同的字节点,用来标识本源文件的属性,例如是否是Form单元等。

2

<BuildConfiguration>

分别定义了基本的(Base)、调试(Debug)、发行(Release)等宏变量。默认值:

  1. Base : Base

  1. Debug :Cfg_1

  1. Release:Cfg_2

节点样例:

<ItemGroup>
        <DelphiCompile Include="$(MainSource)">
            <MainSource>MainSource</MainSource>
        </DelphiCompile>
        <DCCReference Include="uMainForm.pas">
            <Form>Form1</Form>
            <FormType>dfm</FormType>
        </DCCReference>
        <BuildConfiguration Include="Base">
            <Key>Base</Key>
        </BuildConfiguration>
        <BuildConfiguration Include="Debug">
            <Key>Cfg_1</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
        <BuildConfiguration Include="Release">
            <Key>Cfg_2</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
    </ItemGroup>

3). <PropertyGroup Condition=" xxx "> 节点说明

对于 Condition属性不同的值定义不同的参数。

序号

Conditionxxx

含义

1

'$(Base)'!=''

表示项目的默认配置,包括以下节点:

  1. DCC_DcuOutput : Dcu 输出路径

  1. DCC_ExeOutput :Exe 输出路径

  1. Icon_MainIcon :主程序Icon

如果是FMX框架,还包括权限参数的定义。不过自动构建一般不修改这些参数,由IDE生成。

2

$(Base_Win32)'!=''

表示Win32的默认基本配置,VCL框架默认是这个平台,里边包含默认的版本信息等。

3

'$(Base_Win64)'!=''

表示Win64的默认基本配置,VCL框架有这个平台,如果在IDE界面没有增加这个平台,只是有这个节点的简单信息,并没有详细信息。

4

'$(Cfg_1)'!=''

Debug模式的默认配置。

5

'$(Cfg_2)'!=''

Release模式的默认配置

6

'$(Cfg_1_Win32)'!=''

Debug模式下的Win32配置

7

'$(Cfg_2_Win32)'!=''

Release模式下的Win32配置

8

'$(Cfg_1_Win64)'!=''

Debug模式下的Win64配置

9

'$(Cfg_2_Win64)'!=''

Release模式下的Win64配置

10

'$(Base_Android)'!=''

表示Android32的默认基本配置,FMX框架支持。

11

'$(Base_Android64)'!=''

表示Android64的默认基本配置,FMX框架支持。

13

'$(Base_iOSDevice64)'!=''

表示IOS64设备的默认基本配置,FMX框架支持。IOS已经放弃32位,所以只有64位。

14

'$(Base_iOSSimARM64)'!=''

表示IOS64设备的ARM模拟器的默认基本配置,FMX框架支持。

15

'$(Base_Linux64)'!=''

表示Linux64的默认配置

17

'$(Base_OSX64)'!=''

表示Mac OS 在intel平台上的默认配置

18

'$(Base_OSXARM64)'!=''

表示Mac OS 在Arm平台上的默认配置

19

.....

.....

对于Delphi IDE创建好的.dproj文件,如果我们需要修改项目工程的版本信息和图标,只需要关注修改一个<PropertyGroup Condition=" xxx ">节点,具体是那个节点呢?

需要根据Conifg,PlatForm确定。

例如,当我们配置Config是Debug,开发的平台PlatForm是Win64。那么我们就需要修改Condition 等于 '$(Cfg_1_Win64)'!='' 的节点。

4). 举例说明 '$(Cfg_1_Win64)'!='' 节点
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
        <VerInfo_MajorVer>8</VerInfo_MajorVer>
        <VerInfo_MinorVer>8</VerInfo_MinorVer>
        <VerInfo_Release>8</VerInfo_Release>
        <VerInfo_Build>8</VerInfo_Build>
        <VerInfo_Locale>1033</VerInfo_Locale>
        <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=8.8.8.8;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=8.8.8.8;Comments=</VerInfo_Keys>
        <DCC_ExeOutput>.\$(Platform)\$(Config)\Win64_DebugEXE</DCC_ExeOutput>
        <DCC_DcuOutput>.\$(Platform)\$(Config)\Win64_DebugDCU</DCC_DcuOutput>
        <Icon_MainIcon>VCL_DEMO_Icon.ico</Icon_MainIcon>
    </PropertyGroup>

如果需要在编译前修改版本以及图标,就在这个节点中修改。

序号

节点

说明

1

<VerInfo_Keys>

包含的版本信息,对应IDE如下:

2

<DCC_ExeOutput>

<DCC_DcuOutput>

Exe的输出路径

3

<Icon_MainIcon>

程序图标

三、总结

  1. .dproj文件是项目入口总控文件,由Delphi开发环境创建的,不清楚不要轻易修改;

  1. 在Delphi的开发环境已经都编译通过,然后需要自动构建,发布版本、图标等,就可以动态修改.dproj。

  1. 对于自动构建,需要修改的也就是版本信息和图标,其他不用动。

  1. 以上分析仅是个人分析结果,疏漏和错误必然存在,希望有共同需求的的朋友一起完善,需要时可以交流。

今天是2022年大年30,明天就是2023年,兔年!愿大家在新的一年身体健康,喜乐平安!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW查找范例VI

LabVIEW查找范例VILabVIEW拥有数百个范例VI&#xff0c;用户可搜索需要的范例VI并将其整合到自己创建的VI中。除LabVIEW内置的范例VI之外&#xff0c;在ni.com技术支持页中可查看更多的范例VI。用户可根据应用程序的需要对范例进行修改&#xff0c;也可复制并粘贴一个或多个范例…

LC-1824. 最少侧跳次(动态规划)

1824. 最少侧跳次数 难度中等49 给你一个长度为 n 的 3 跑道道路 &#xff0c;它总共包含 n 1 个 点 &#xff0c;编号为 0 到 n 。一只青蛙从 0 号点第二条跑道 出发 &#xff0c;它想要跳到点 n 处。然而道路上可能有一些障碍。 给你一个长度为 n 1 的数组 obstacles &a…

【FPGA】Verilog 实践:狄摩根定律 | 布尔方程 | 1bit 比较器

写在前面&#xff1a;为了解狄摩根定理和布尔函数的行为&#xff0c;我们使用 Verilog 实现狄摩根定律和布尔函数的行为。生成输入信号后&#xff0c;验证通过仿真实现的结果。 Ⅰ. 前置知识 0x00 离散结构&#xff1a;否定量词的狄摩根定律 否定量词的狄摩根定律是&#xf…

基于自适应降噪的深度神经网络对抗图像检测【论文阅读】

近年来&#xff0c;许多研究表明&#xff0c;深度神经网络(DNN)分类器可能会被对抗性示例所欺骗&#xff0c;这种对抗性示例是通过对原始样本引入一些扰动来设计的。据此&#xff0c;提出了一些强大的防御技术。然而&#xff0c;现有的防御技术往往需要修改目标模型或依赖于攻击…

针对容器场景的多功能渗透工具

介绍 CDK是一款为容器环境定制的渗透测试工具&#xff0c;在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式&#xff0c;插件化管理。 下载/植入 将可执行文件投递到已攻入的容器内部开始使用 https://github.c…

浏览器打不开某些网站是什么原因导致,试试用这些方法来解决

不少小伙伴使用一些浏览器浏览网页的时候&#xff0c;发现打不开某些网站&#xff0c;这是什么原因导致的呢?本文讲汇总几个常见的原因&#xff0c;我们可以通过以下几个原因排查&#xff0c;并且使用下文的解决方法可以试试能否打开网站。打不开网站的原因1、浏览器限制如果用…

SpringMVC工作流程

SpringMVC工作流程 1. SpingMVC的常用组件 1&#xff09;DispatcherServlet 是一种前端控制器&#xff0c;由框架提供。作用&#xff1a;统一处理请求和响应。除此之外还是整个流程控制的中心&#xff0c;由 DispatcherServlet 来调用其他组件&#xff0c;处理用户的请求 2&am…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 8 Desktop。 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&am…

【甄选靶场】Vulnhub百个项目渗透——项目五十六:sp-jerome(squid代理,计划任务)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十六&#xff1a;sp-jerome&#xff08;文件上传&#xff0c;缓冲区溢出&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4…

微信公众号主体已注销 如何办理账号迁移和公证书?

公众号主体公司已经注销&#xff0c;公众号也可以办理迁移的。而且需要尽快迁移&#xff0c;如果被微信系统检测到主体注销&#xff0c;而公众号还在经营就会要求限期迁移&#xff0c;否则公众号将被冻结。 下面我们就来说一下&#xff0c;主体已注销如何办理公众号迁移。 注&a…

Ubuntu20.04+GLFW搭建OpenGL开发环境

环境 系统&#xff1a;Ubuntu 20.04 桌面环境&#xff1a;X11 OpenGL版本: 3.0 桌面环境怎么看呢&#xff1f;可以在终端输入echo $XDG_SESSION_TYPE 即可&#xff0c;或者查看桌面右上角的Settings->About&#xff0c;查看Windowing System 查看OpenGL版本 使用glxinfo命…

【数据结构】深度剖析栈的各接口功能实现

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一.栈的概述&#x1f95d;&#xff1a; 1.栈的概念&#xff1a; 2.栈的结构&#xff1a; &#x1f349; 二、栈的各接口功能实现&#x1f349;&#xff1a; 1.栈的初始化&#xff1a; 2.压栈&#xff1a;…

十六进制转八进制(蓝桥杯基础练习C/C++)

我首先想到的就是十六进制转十进制&#xff0c;十进制转八进制&#xff0c;毕竟这样的方法是最常见的&#xff0c;但始终出现报错。 我想可能是int能储存的数范围太小了&#xff0c;就尝试用long long存储&#xff0c;结果还是报错。 #include <bits/stdc.h> using nam…

C++语法复习笔记-1. c++指针

文章目录1. 计算机内存1. 储存层次2. 内存单元与地址3. 指针定义2. 左值与右值1. 数组与指针1. 概念3. C中的原始指针1. 数组指针与指针数组2. const pointer 与 pointer to const3. 指向指针的指针4.关于野指针4.1 指向指针的指针4.2 NULL指针4.3 野指针5. 指针的基本运算5.1 …

Linux基础 IO

目录 一、文件操作 1.1 C语言文件操作 1.2 文件 系统调用接口 1.2.1 open/close函数 1.2.2 write/read函数 二、进程与文件 2.1 0&1&2 文件描述符 2.2 C语言FILE 2.3 (OS管理&进程找到) 被打开文件方法 2.3.1 struct file 描述文件属性(OS管理文件) 2.3…

线性时变系统的PID控制-2

在线性时变系统的PID控制-1的基础上采用S函数进行Simulink仿真。被控对象的描述方式可变换为&#xff1a;在S函数中&#xff0c;采用初始化、微分函数和输出函数&#xff0c;即mdllnitializeSizes函数、mdIDerivatives函数和mdlOutputs函数。在初始化中采用sizes结构&#xff0…

力扣sql简单篇练习(三)

力扣sql简单篇练习(三) 1 查找重复的电子邮箱 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT Email FROM Person GROUP BY Email HAVING count(id)>21.3 运行截图 2 每个产品在不同商店的价格 2.1 题目内容 2.1.1 基本题目信息 2.1.2 示…

[经典的图像warping方法] Thin Plate Spline: TPS理论和代码详解

0. 前言 2022年没有新写什么博客, 主要精力都在搞论文. 今年开始恢复! 本文的目标是详细分析一个经典的基于landmark(文章后面有时也称之为控制点control point)的图像warping(扭曲/变形)算法: Thin Plate Spine (TPS). TPS被广泛的应用于各类的任务中, 尤其是生物形态中应用…

动态内存管理(C语言)

目录 为什么要存在动态内存分配 动态内存函数的介绍 malloc函数 free函数 calloc函数 realloc函数 常见的动态内存错误 对NULL指针解引用错误 对动态开辟的空间越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟…

客快物流大数据项目(一百零五):启动ElasticSearch

文章目录 启动ElasticSearch 一、启动ES服务端 二、​​​​​​​启动Kibana 启动ElasticSearch