Delphi读取Android设备联系人.DelphiXE6中编译通过

和某牛讨论Delphi读Android联系人.写了如下代码

我是个懒人,不想再深究了.
对了,别忘了Android有权限,加上读取联系人的权限[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , | 155条评论

Delphi Hook Library做了一点小更新

https://www.raysoftware.cn/?p=357

1.原来的HOOK库,当遇到函数先被别人HOOK了,会无视对方的钩子,造成函数出问题.
现在加入了处理,如果想要HOOK的函数先被别人HOOK了,那么就去HOOK对方的函数.
但是要记得UnHOOK的时候也最好在对方去掉HOOK之前做.

2.原来的Hook库代码是通过返回值返回原始函数地址的,导致HOOK函数内部使用的虚拟内存和线程状态设置函数不能被HOOK.现在修正了.具体请看新增的函数声明

最新代码请到谷歌代码上去拉取

http://code.google.com/p/delphi-hook-library/[……]

继续阅读

发表在 Delphi | 176条评论

Delphi循环移位操作

如果在X86计算机上很简单,直接内嵌汇编ror和rol指令就是循环移位.
但是如果在Android的平台上,asm关键字是无效的.
只能自己实现.

function ror(const Value: DWORD; ShiftValue: Byte): DWORD; overload;
begin
Result := (Value shl (8 * SizeOf(Value) – ShiftValue)) or
(Value Shr ShiftValue);
end;

function ror(const Value: WORD; ShiftValue: Byte): DWORD[……]

继续阅读

发表在 Delphi, 未分类 | 154条评论

Delphi XE5开发Android程序使用自定义字体文件.

最近在做一个电子书阅读器的Android小程序来验证Delphi XE5的移动开发功能.
万事大吉,只欠根据字体文件(.ttf文件)切换阅读字体,通常Android系统只带三种以下字体.一般用Java/Eclipse开发的话比较简单,typeface的createFromAsset,createFromFile之类的很容易使用.
但是由于FireMonkey是跨平台的类库,必然不能和平台帮得太紧,所以提供了抽象的封装.
但是也许Delphi XE5是Android平台的第一个版本,有些地方难免有疏漏,FireMonkey的封装没有提供更换字体的功能.

但是我要实现的电子书阅读器换字体几乎是必[……]

继续阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 171条评论

Delphi移动平台上生存期自管理一些问题的避免

今天和Delphi高手刘麻子讨论了一下移动平台上生存期自管理容易导致的一些问题.有几点体会

在移动平台上Delphi的对象是生存期自管理的,这和早期版本和现有的PC版本有很大不同.
大部分时间我们原来的代码不会有问题.我们原来的手动释放代码在移动平台也不会有问题,因为TObject.Free方法在移动平台上就是个摆设.

真正调用到对象的Destroy的只有编译器自动产生的代码.
一般有两种情况.
1. :=也就是赋值,会调用旧的变量内容的__ObjRelease减少引用计数,会调用新变量内容的__ObjAddRef增加引用计数.
2.当变量销毁时,如局部变量离开函数恢复栈的时候,如成[……]

继续阅读

发表在 Delphi, 未分类 | 197条评论

跨平台的Html解析代码,甩掉包袱的选择

跨平台的Html解析代码
当时写了这个Html解析,可以跨Windows,MacOSX的平台.但是随着Delphi XE5的发布,发现这个代码在Android平台不能用了,因为Delphi在移动平台上的字符串字符索引下标变成0了,带来了很多问题.
于是把这个HTML解析器重写了一个版本,放弃对Delphi XE3以下版本的支持,轻装上阵.
因为也有传说易博龙会在以后某个时期放弃移动版本Delphi对指针的支持,所以这次重写的新版本里面完全去掉了指针的语法.
对外的接口基本没变,所以旧代码可以方便迁移上来.新的单元名叫HtmlParser_XE3UP.pas,很直接吧.同时如果是广大旧版本Del[……]

继续阅读

发表在 Delphi, 未分类 | 183条评论

关于DelphiXE5如何获取Android手机SIM卡串号

手机号不是存在SIM卡上的,SIM卡只有一个串号.
在运营商的服务器上有手机号和序号对应的一张表.所以你SIM卡办理遗失,运营商只要把新SIM卡的串号和你原来的手机号绑定即可.

获取手机号的唯一办法是收个短信,短信里面有你的手机号码.所以很多程序为了获取手机号会要求你注册时发短信,然后它给你回个短信.[……]

继续阅读

发表在 Delphi, 未分类 | 163条评论

Delphi新语法和ifthen的扩展联想.

看看Delphi重载了多少个ifthen函数.
Math单元
function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload; inline;
function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 = 0): Int64; overload; inline;
function IfThen(AValue: Boolean; const ATrue: UInt64; c[……]

继续阅读

发表在 Delphi, 未分类 | 203条评论

Android的路径信息

刚好有个朋友问Android中怎么获取安装路径.
Delphi早就把IO相关的都提取到System.IoUtils单元中了.

路径操作就使用TPath的方法都很方便.
uses
System.IoUtils
TPath.GetTempPath//临时目录
TPath.GetCameraPath//照相机目录(照片/录像)
TPath.GetMusicPath//音乐目录
TPath.GetDownloadsPath//下载目录
……
如果使用TPath类的静态方法那么代码就是跨平台的,在Windows,Mac,iOS,Android上都能用.
如果仅仅对Android的操作也可以[……]

继续阅读

发表在 Delphi, 未分类 | 162条评论

XE5开发Android程序调用电话相关功能(短信息和电话)

其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍.

1.短信息.很简单

方法a.不使用Intent而是直接发短信.
smsManager对应的Delphi代码应该是:

至于双卡双待用哪个卡来发送这些我没有详细研究,有兴趣的朋友可以研究下.
方法b.使用Intent启动系统的短信程序:
我猜以后这种方式会和电话一样会合并到TPlatformServices中.

2.电话

这段代码适用于iOS和Android.
Android平台上实际上电话的封装就是系统的Intent方式调用.[……]

继续阅读

发表在 Delphi, 未分类 | 204条评论