跨平台的,在FMX中读取ICON文件的每一帧到Bitmap

昨天在使用FreeImage的时候发现FreeImage对ICON的处理有问题,32位的帧读出来的背景居然是黑的。我猜应该是32位没有And的Mask数据。而它按照24位以下的处理方式把Alpha值填成255了。

只能自己动手写代码,也不复杂,算上把Windows单元抽出来声明的结构体,也就300行。经测试可以在Win32,Win64,Android,FMX for Linux上可以正常使用。

如此的简单,就不上传工程了,直接贴代码就是了。


unit FMX.Images.icon;

{
  wr960204武稀松
  2017.4.18
  FMX读取I[......]

全文阅读

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

关闭掉新版Delphi的几个固定导出函数(__dbk_fcall_wrapper,dbkFCallWrapperAddr,TMethodImplementationIntercept)

不知道从什么时候起Delphi编译的PE文件总是三个固定的导出函数。

一方面有强迫症的同学们会不爽,另一方面其实是不安全的。

这三个函数是:__dbk_fcall_wrapper,dbkFCallWrapperAddr,TMethodImplementationIntercept

有两种方式可以去掉他们。

1.修改RTL源代码,注释掉这几处函数的exports代码行。重新编译。不过重新编译对小白或者比较懒的同学确实不方便。况且出了新版本Delphi又要重做一遍。

2.把编译后的EXE,DLL处理一下,去掉这几个函数。

做了个小工具,可以删除EXE,DLL的导[......]

全文阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 留下评论

FireMonkey在使用GDIPlus放大图像的Bug的修复

Delphi10.2中FireMonkey中GDIPlus放大图片的Bug,不知道从哪个版本开始的,还是一直都这样。

新建一个FireMonkey工程,窗口上放一个Image控件,WrapMode设置为Stretch,表示随控件大小缩放。指定一张小图。

默认使用D2D的时候放大没问题

关闭D2D使用GDIPlus渲染

initialization
GlobalUseDirect2D := False;
finalization

end.

再看:

 

边缘多了一圈渐变。

找到FMX.Canvas.GDIP.pas[......]

全文阅读

发表在 Delphi, 未分类 | 标签为 , , , , | 留下评论

FireMonkey GIF处理的更新

盒子上人才济济,很快就有兄弟发现在Android中有问题。

经过调试,发现Android中TCanvas.DrawBitmap对透明处理跟Windows不太一样,而是把透明部分也覆盖上去了,于是自己处理了一下帧的叠加,自己复制Bitmap的Scanline颜色,跳过透明即可。

2017.4.19加入对FMX for Linux的支持
http://www.raysoftware.cn/?p=559

发表在 Delphi | 标签为 , , | 一条评论

FireMonkey跨平台的GIF解决方案

用FireMonkey的同学们一定知道FireMonkey对GIF动画的支持不是太好,只有静态的。

网上已有的解决方案就是先手动预处理GIF文件分割成多个单张,然后放到BitmapList中,缺点是要手动处理,而且帧速率也麻烦。因为项目中要实现了一个GIF的格式处理,代码整理了一下,嫁接到FireMonkey中,给广大兄弟们使用。

主要是就实现一个GIF格式的Reader,把GIF每一帧解析出来变成TBitmap,帧速率读出来,按照指定的帧速率播放。

之前用GDIPlus写了一份,但是有两个原因促使我自己重头写。

1)GDIPlus不能跨平台只支持Windows,[......]

全文阅读

发表在 Delphi | 标签为 , , , , | 留下评论

VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数

这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵。

至于MakeObjectInstance是什么,Delphi转过来的同学必然很了解这个方便的功能,就是动态构造一个函数把普通函数转到一个类的成员函数。

VC X86实现起来没问题,但是X64实现起来的麻烦在于不能内嵌汇编了,X64必须结合ASM文件编译的obj(这一点还是感激Delphi的编译器,X86和X64都可以内联汇编)。

我的实现方案是通过构造一段ShellCode来达到目的。


SIZE_T Pag[......]

全文阅读

发表在 CPP | 留下评论

Cocos2d-x程序Windows下VC中文乱码的解决

Cocos2d-x默认字符串常量编码都是UTF8的,而Windows中的VC默认都是跟系统相同,比如简体Windows是GB2312或者GBK.繁体就是BIG5编码.
而我们大多数中国人用VC编译出来的字符串常量也就是GBK编码的字符串.
在Cocos2d-x界面上绘制的时候它是不知道的,只会认为这个是UTF8字符串,结果就出现了乱码.
解决方式也很简单.找个头文件加入下面的代码

#ifdef WIN32

inline std::wstring AnsiToUnicode(const char* buf)
{
	int len = ::MultiByteToWideC[......]

全文阅读

发表在 cocos2d-x, CPP, 未分类 | 留下评论

Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.

恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的动态数组扩展.http://www.raysoftware.cn/?p=278
现在有一个更悠久的历史需求,在QC的Delphi板块上置顶了好多年.官方一直没有实现.
http://qc.embarcadero.com/wc/qcmain.aspx?d=21729
众所周知Delphi的record和CPP的struct是有区别的.CPP的struct可以看成是class的别名,可以有构造,析构,可以继承.

Delphi的record几年前开始支持方法,支持操作符重载,美中不足之处在于不能自己写默认构[......]

全文阅读

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

HTML解析器更新

增加了兼容性.
对于非标准的HTML做法,Tag中的符号没有转义做了兼容.
HtmlParser
或者

http://code.google.com/p/delphi-html-parser/

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

共享一个之前封装的多进程共享内存的MemoryStream

具体用处呢,有很多,比如多进程浏览器共享Cookie啦,多个进程传送点数据啦.

{
共享内存封装.
封装成了MemoryStream的形式.
用法如下:
  var
    ms : TShareMemStream;
  ms := TShareMemStream.Create('Global\test', FILE_MAP_ALL_ACCESS, 4096);
  if (ms.Memory <> nil)(*and(ms.AlreadyExists)*) then
  //如果创建失败Memory指针是空指针
  //AlreadyExists表示已经存[......]

全文阅读

发表在 Delphi | 标签为 , , | 5条评论

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

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

uses
  FMX.Helpers.Android,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText,
  FMX.Platform.Android, Androidapi.JNIBridge, Androidapi.JNI.Provider,
  Androidapi.Helpers;

procedure QueryContact(AName: string; AList: TStrings);
var
  cursorC[......]

全文阅读

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

Delphi Hook Library做了一点小更新

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

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

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

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

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

全文阅读

发表在 Delphi | 29条评论

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: By[......]

全文阅读

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

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

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

但是我要实现的电子书阅读器换字[......]

全文阅读

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

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

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

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

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a[......]

全文阅读

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

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

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

全文阅读

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

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

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

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

uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge,
  Androidapi.JNI.Telephony, Androidapi.JNI.JavaTypes, FMX.Helpers.Andr[......]

全文阅读

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

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: UInt6[......]

全文阅读

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

Android的路径信息

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

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

全文阅读

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

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

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

1.短信息.很简单

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

uses
  Androidapi.JNI.JavaTypes,Androidapi.JNI.Telephony;
var
  j: JSmsManager;
begin
  j := tjsmsmanager.Create;
  j.sendTextMessage(stringtojstri[......]

全文阅读

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

Delphi XE5中移动平台的字符串要注意的事项

今天把项目往移动平台移植,遇到指针错误,无效地址访问.
XE5的单步调试速度太让人崩溃了.
发现错误出在一个字符串的循环上,我是for i:= 1 to length(字符串变量) do
结果报错.
看了一下XE5的DateType的帮助说明:
Note: All the string types described in this topic are supported by the Delphi desktop compilers (DCC32, DCC64, and DCCOSX).
However, the Delphi mobile compilers (DCCIOS32[......]

全文阅读

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

Delphi XE5的体验

XE5发布了.
在家里装了3台计算机体验,发现了一些问题.
1.XX工具报错,发现是BDS.EXE大小校验失败.从别处弄一个覆盖然后XX成功.
2.某绿色版可以用,但是因为是绿色版,没有自动安装JDK和AndroidSDK,要手动配置在SDK Manager中添加SDK的路径.否则不能开发Android移动程序
3.有一台计算的项目中Target中看不到设备,手机插拔确认了N次,USB调试也是开着的.但是就是看不到.后来用任务管理器发现是某公司(不说具体名字)的一款产品自带了ADB.EXE.而且这个ADB.exe一直在运行,杀死马上自动启动.所以端口一直被占着.卸载该产品,那么Andr[......]

全文阅读

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

Delphi XE5的移动项目中对象已经是生存期自管理的了

Delphi XE5的移动项目中对象已经是生存期自管理的了
TTest = class
protected
destructor Destroy; override;

public
procedure BeforeDestruction; override;

end;

procedure TTest.BeforeDestruction;
begin
inherited;
ShowMessage(‘TTest.BeforeDestruction’);
end;

destructor TTest.Destroy;
b[......]

全文阅读

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

跨平台的Html解析代码

前一段时间为了解析HTML在网上找Delphi版本的HTML解析器,发现没有太好用的.遇到复杂的HTML都会出错.最常见的JavaScript中嵌入HTML的字符串,会解析出错.
至于收费的没看过.不知道怎么样.

于是自己写了一个,到现在没有遇到解析出错的HTML.现在公开出来给大家用.只是苦了老外那几个收费的.

采用的是接口形式,生存期自管理,不用理会释放的事情.最近又增加了CSS Selector语法的查找功能.可以像CSS选择器一样选择节点.
只引用了SysUtils单元.避免了在高版本Delphi中Classes这个体积大户.同时也具有较好的跨平台性.
支持Delph[......]

全文阅读

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

Delphi Hook Library

常常见到有朋友问Hook怎么做和COM的HOOK怎么弄.
来点干货,给Delphi业界朋友做点贡献.把我之前写的一个Delphi Hook库放到了Google Code上.方便大家.
微软官方钩子库Detours X86是免费的,X64可是要1000美刀的哦.
支持X86,X64的函数钩子.线程安全.
封装了对COM对象的Hook.在Hook COM对象的时候方法时会自动判断是Delphi还是其他语言实现的COM对象,从而进行智能处理.

其实代码加注释也就几百行.一个单元文件而已.
其中使用了开源的BeaEngine的反汇编引擎来判断代码的大小,避免机器指令被从中间切开.[......]

全文阅读

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

Delphi写ShellCode获取Kernel32.DLL的地址.

好几年前曾写过一些ShellCode代码.
Delphi是最适合写ShellCode的工具
很多年没用了,今天刚刚回头看了一下,发现是随着系统的发展,其中获取Kernel32.DLL的方法在Vista/WIN7时代和X64中都已经不使用了.
就完善了一下.
现在是XP/Vista/WIN7以及X86/X64通吃.

function Kernel32Handle(): HMODULE;
{$IFDEF CPUX64}
asm
  mov rbx,$60
  mov rax,[gs:rbx]   // peb
  mov rax,[rax+$18]  // LDR
  m[......]

全文阅读

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