http://www.cnblogs.com/onechen/p/3627942.html

XE7 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE7.zip

XE6 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE6.zip

XE5 源码下载:[原创]取得APP自己的版本号(狠跨4个平台).zip

//------------------------------------------------------------------------------
// by [龟山]阿卍 QQ:1467948783
// http://www.cnblogs.com/onechen/
//------------------------------------------------------------------------------ unit Main; interface uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF MSWINDOWS}
Winapi.Windows,
{$ENDIF} {$IFDEF ANDROID}
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android,
Androidapi.Helpers, // XE7 需要引入
{$ENDIF}
  {$IFDEF IOS}
FMX.Platform.iOS,
iOSapi.Foundation,
Macapi.ObjectiveC,
{$ENDIF} {$IFDEF MACOS}
FMX.Platform.Mac,
Macapi.Foundation,
Macapi.ObjectiveC,
{$ENDIF} FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
FMX.Memo, FMX.StdCtrls; type
TForm1 = class(TForm)
ToolBar1: TToolBar;
Label1: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.fmx} {$IFDEF MSWINDOWS}
procedure GetBuildInfo(var V1, V2, V3, V4: word);
var
VerInfoSize, VerValueSize, Dummy: DWORD;
VerInfo: Pointer;
VerValue: PVSFixedFileInfo;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
if VerInfoSize > 0 then
begin
GetMem(VerInfo, VerInfoSize);
try
if GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
begin
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
V1 := dwFileVersionMS shr 16;
V2 := dwFileVersionMS and $FFFF;
V3 := dwFileVersionLS shr 16;
V4 := dwFileVersionLS and $FFFF;
end;
end;
finally
FreeMem(VerInfo, VerInfoSize);
end;
end;
end; function GetBuildInfoAsString: string;
var
V1, V2, V3, V4: word;
begin
GetBuildInfo(V1, V2, V3, V4);
Result := IntToStr(V1) + '.' + IntToStr(V2) + '.' +
IntToStr(V3) + '.' + IntToStr(V4);
end;
{$ENDIF} procedure TForm1.FormCreate(Sender: TObject);
{$IFDEF MSWINDOWS}
begin
Memo1.BeginUpdate; Memo1.Lines.Add('OS : Windows');
Memo1.Lines.Add('ver : ' + GetBuildInfoAsString); Memo1.EndUpdate;
end;
{$ENDIF} {$IFDEF ANDROID}
var PackageInfo: JPackageInfo;
PackageName: JString;
begin
Memo1.BeginUpdate; Memo1.Lines.Add('OS : Android');
Memo1.Lines.Add('applicationLabel : ' + GetApplicationTitle); PackageName := SharedActivityContext.getPackageName;
Memo1.Lines.Add('packageName : ' + JStringToString(PackageName)); PackageInfo := SharedActivityContext.getPackageManager.getPackageInfo(PackageName, 0);
Memo1.Lines.Add('versionName : ' + JStringToString(PackageInfo.versionName)); Memo1.EndUpdate;
end;
{$ENDIF} {$IF Defined(IOS) or Defined(MACOS)}
var AppNameKey: Pointer;
AppBundle: NSBundle;
NSAppName: NSString;
begin
Memo1.BeginUpdate; Memo1.Lines.Add('OS : iOS');
AppBundle := TNSBundle.Wrap(TNSBundle.OCClass.mainBundle); AppNameKey := (NSSTR('CFBundleName') as ILocalObject).GetObjectID;
NSAppName := TNSString.Wrap(AppBundle.infoDictionary.objectForKey(AppNameKey));
Memo1.Lines.Add('CFBundleName : ' + UTF8ToString(NSAppName.UTF8String)); AppNameKey := (NSSTR('CFBundleDisplayName') as ILocalObject).GetObjectID;
NSAppName := TNSString.Wrap(AppBundle.infoDictionary.objectForKey(AppNameKey));
Memo1.Lines.Add('CFBundleDisplayName : ' + UTF8ToString(NSAppName.UTF8String)); AppNameKey := (NSSTR('CFBundleIdentifier') as ILocalObject).GetObjectID;
NSAppName := TNSString.Wrap(AppBundle.infoDictionary.objectForKey(AppNameKey));
Memo1.Lines.Add('CFBundleIdentifier : ' + UTF8ToString(NSAppName.UTF8String)); AppNameKey := (NSSTR('CFBundleVersion') as ILocalObject).GetObjectID;
NSAppName := TNSString.Wrap(AppBundle.infoDictionary.objectForKey(AppNameKey));
Memo1.Lines.Add('CFBundleVersion : ' + UTF8ToString(NSAppName.UTF8String)); Memo1.EndUpdate;
end;
{$ENDIF} end.

取得 APP 自己的版本号 (跨 4 个平台)的更多相关文章

  1. 取得 APP 自己的版本号 (狠跨 4 个平台)

    XE7 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE7.zip XE6 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE6.zip XE5 源码下载:[原创]取得APP自己 ...

  2. (译)cocos2d-x跨android&ios平台开发入门教程

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  3. 转:一个跨WINDOWS LINUX平台的线程类

     来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...

  4. App山寨疯狂 爱加密Apk加密平台防破解

    App山寨疯狂 爱加密Apk加密平台防破解,Android系统由于其开源性,眼下已占领全球智能机近80%的市场,远超微软的WP系统和苹果的IOS系统.然而也正是由于开源性,Android盗版App在国 ...

  5. C#--图片上传(PC端和APP)保存及 跨域上传说明

    手动跨域操作文件 补录:跨域访问文件夹文件是一种常见的需求,下面主要介绍的的通过代码使用具有权限账号的人来达到跨域操作文件的能力. 现在补充一下普通的一些需求场景,今天就遇到了一种需要经常需要登录远程 ...

  6. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  7. html5 app开发实例 Ajax跨域访问C# webservices服务

    通过几天的研究效果,如果在vs2010工具上通过webservice还是比较简单的,毕竟是一个项目. 如果您想通过HTML5 做出来的移动APP去访问c#做出来的webservice,那么就没那么简单 ...

  8. js判断是否是app,及版本号

    判断是否是android,ios,qq,wetchat export const Config = {}; Config.ua = navigator.userAgent.toLowerCase(); ...

  9. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去

    在之前的一篇博文( Android 之窗口小部件详解--App Widge t)中,已经介绍了App Widget的基本用法和简单实例.这篇主要讲解 App Widget 的高级内容,即通过 Remo ...

随机推荐

  1. 关于时间查询的sql语句

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  2. 可能空字符串转换为浮点型或者整数型:java.lang.NumberFormatException: For input string: " "

    Integer.valueOf(str.equals("")?"0":str)

  3. zoj1004-Anagrams by Stack 【栈 dfs】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4 Anagrams by Stack Time Limit: 2 Seconds ...

  4. 使用生活实例理解Asp.net运行时

    学习编程语言,掌握面向对象的编程思想尤为重要,一旦理解了面向对象的这种概念,那么好些地方拿到生活中去理解,就容易的多了.书本上的枯燥干涩的语言,对于好多人来说,即难懂,更难长时间牢牢记得.但是编程语言 ...

  5. win下php的memcached的安装与使用

    1.memcache的php扩展与memcached服务器的区别? php要操作memcached就必须要安装memcache的扩展, 在http://windows.php.net/download ...

  6. linux系统命令笔记

    一.linux系统目录 /bin 系统命令目录 /dev 设备目录 /home 每个系统用户在home下都有一个目录, 每个用户登录到系统后会自动登录到这个目录下, root用户会在/root文件夹下 ...

  7. 分享chrome清空缓存开发小技巧

    在打开开发者工具的前提下,左键长按刷新页面小图标(左上角,地址栏左侧),可以调出清空缓存下拉选择项.

  8. 我们在地址栏中输入一个网址,比如百度(www.baidu.com)后浏览器做了哪些事

    在浏览器输入网址,Enter之后发生的事情: 1. 浏览器接收域名 2. 发送域名给DNS,中文名字是域名系统服务器,一般位于ISP(互联网服务提供商,比如我们熟知的联通.移动.电信等) 中.浏览器会 ...

  9. 2018.10.19 NOIP训练 桌子(快速幂优化dp)

    传送门 勉强算一道dp好题. 显然第kkk列和第k+nk+nk+n列放的棋子数是相同的. 因此只需要统计出前nnn列的选法数. 对于前mmm%nnn列,一共有(m−1)/n+1(m-1)/n+1(m− ...

  10. 39 What Determines the Kind of Person You Are ?是什么决定了你是哪种内型的人 ?

    What Determines the Kind of Person You Are ?是什么决定了你是哪种内型的人 ? ①What determines the kind of person you ...