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, 未分类 | 144条评论

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, 未分类 | 111条评论

跨平台的Html解析代码

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

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

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

全文阅读

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

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, 未分类 | 313条评论

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, 未分类 | 116条评论

从DelphiXE4的例子分析FireMonkey ListBox效率问题.

DelphiXE4有一个Demo CustomListBox.
演示的是一个自定义Item的ListBox.其中有一个按钮,一次添加1000个Item.
尝试着把循环加到10000.乖乖,添加时慢得不得了,接近10秒才能添加完.我当初做光速搜索的时候几百万文件搜索都是100毫秒内解决的.差距怎么这么大.
结果是经过调整,添加10000个Item的时间由10秒提高到了800毫秒,不要太过分哦.

查看了一下Demo中的Button2Click中的代码.
改回到1000次循环,因为AQTime中执行比较慢,10000次循环等不起.

使用AQTime工具分析了一下时间.最后Bu[......]

全文阅读

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

奇技淫巧之Delphi和JavaScript互通

Delphi2010以后增加了新的RTTI信息,也就是通过RTTI可以在运行时获取/调用对象的公开成员或者函数.
ScriptControl可以添加外部的对象,这个对象是个IDispatch接口,脚本调用的时候实际上是调用IDispatch的Invoke方法.
那么我们只要实现了IDispatch的Invoke方法,在里面通过RTTI再转而调用Delphi对象的Public方法即可.通过这个可以代理任何Delphi的对象.

仅仅调用Delphi对象似乎还不够完美,对象事件如果能关联到脚本的函数就更好了.那好,封装一个事件代理的类就可以.
例子如下:

procedure TFo[......]

全文阅读

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

奇技淫巧之获取Delphi所有类的类信息

这个绝大多数朋友应该是用不上的,纯属玩的.
昨天和业界某几个人讨论delphi的class的typeinfo问题,一般implementation部分实现的类在别处是拿不到类型信息的,尽管它有.
还比如私有的嵌套类在别处也拿不到.
于是写了几行代码扫描进程中所有类的类型信息,把这些Unpublic的classinfo也都翻出来.
本来纯属玩的.结果GetAllClassInfos_FromSystemModuleList发现如果把这个做成IDE插件跑起来居然可以看到一些敏感的类的信息,这些类估计都是在implementation部分实现的.比如TLicenceXXX并可以继续TypeI[......]

全文阅读

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

Delphi的DateTimeToUnix/UnixToDateTime的一点小改进

Delphi的DateTimeToUnix/UnixToDateTime转换时间并没有考虑到本地时间和格林尼治时间的差,结果我天朝时间被赤裸裸的差了8个小时.

type
  time_t = Int64;
function DateTimeToUnix(ConvDate: TDateTime): time_t;
var
  zi : TTimeZoneInformation;
begin
  GetTimeZoneInformation(zi);
  Result := Round((ConvDate - UnixDateDelta) * 86400) + 60*(zi.B[......]

全文阅读

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

以低用户权限启动一个进程.比如Vista或者WIN7中的IE

{ *******************************************************

以低权限启动一个进程(例如IE)

版权所有 (C) 2013 wr960204 武稀松

******************************************************* }

unit LowIntergrityLevelProcess;

interface

uses
WinApi.Windows;

const
SECURITY_MANDATORY_UNTRUSTED_RID = $00[......]

全文阅读

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

Delphi泛型动态数组的扩展.

从Delphi支持泛型的第一天起就有了一种新的动态数组类型,泛型化的动态数组–TArray.
虽然这个类型比较方便,但是却没有提供更丰富的操作.因为XE4中提供了对数据类型的Helper扩展,例如StringHelper,企图实现一个TArrayHelper但是发现Helper不支持泛型的类型.
没办法只好包装了一个record,好处是似乎只要支持泛型的Delphi版本都可以支持.使用效果如下.

var
  //声明动态数组
  a, b, c: TArrayEx<Integer>;
  f: TArrayEx<Single>;
  s : TArr[......]

全文阅读

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

Delphi XE4做一个超小的浏览器.(做一个超级小的WebBrowser)

用DelphiXE4开发一个40KB的浏览器.

刚好有个需求是要访问一个网页,但是程序的体积又不能太大.
DelphiXE4以后编译出的代码体积越来越大.我一直都是追着最新的Delphi版本,所以不可能退回早期版本.
研究了一下,发现Classes,Rtti,Themes,Controls,Forms这个单元是高高位于体积之首的.
空工程:
System.Classes 398,080 CODE
System.Rtti 293,860 CODE
Vcl.Themes 243,644 CODE
Vcl.Controls 130,056 CODE
Vcl.Forms 12[......]

全文阅读

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

Delphi编解码JS字符串.

今天在CSDN回答网友问题,实际上就是JS字符串的解码.给他写了几行简单的代码,转义符也没全部处理.
闲着没事手痒痒,就把JS字符串的编解码都写出来,转义符也全部处理了.说不定以后用得上.
参考的Json.org上的编码规范.

CSDN问题


function EncodeJSStr(const value: Widestring): Widestring;
var
  P: PWideChar;
begin
  Result := '';
  P := PWideChar(value);
  while P^ <> #0 do
  begin[......]

全文阅读

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

JCL for Delphi XE4

Delphi XE4出来有段时间了,但是JCL(JEDI Code Library )一直还没有能在XE4中使用的版本.
SVN拉下JCL最新的代码,在XE4上修改了一下做出了这个JCLDelphi5-XE4都能用的版本.
主要变化是Delphi XE4中SysUtils单元中的AnsiString相关函数都被挪到了System.AnsiStrings单元中.其他变化都不大.
(Vista/WIN7用管理员权限执行)Install multiple profiles.bat即可安装

下载地址:http://www.raysoftware.cn/content/JCL_D5-XE4.[......]

全文阅读

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

XE4中FMX一些改进

今天把XE3的一些项目升级到了XE4,发现了一些不同.
1.Style文件格式发生了变化
2.FMX单元的做了一些拆分和调整.这个正是之前我最诟病的.FMX的单元引用十分混乱,一看就没有经过仔细的设计.
例如XE3中FMX.Types单元辗转竟然赢了ListBox,Edit等单元.
动画和滤镜等单元也比较恶心,一旦使用了一个特效就会引用全部特效类,因为单元初始化节把所有的特效都注册了,结果因为这些类用到过了,所以没法被优化掉.
如:FMX.Ani中

initialization
  RegisterFmxClasses([TColorAnimation, TGra[......]

全文阅读

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

看Delphi XE4 iOS开发第一眼

继昨天,今天到了公司,用了某人的Mac Book Pro视网膜屏就是李维说很贵的那款,试了一下.
DelphiXE4的Demo直接输出到XCODE的iOS模拟器上,非常顺利,没有任何问题.而且也很流畅.
我猜是XE4只是提供了FireMonkey的设计器,到时候把它自动转换到XCODE对应的设计上.反正界面和代码是分离的,代码估计还是在Windows平台上由Delphi for iOS编译器编译的.界面经XCODE转换后作为资源合成到一块,产生的iOS程序.
因为只是FireMonkey作为一个Windows上的设计器,所以控件什么的都是FireMonkey模拟的,实际没有功能,所以XE[......]

全文阅读

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

Delphi XE4 第一印象

昨天听说DelphiXE4发布了.赶快去易博龙申请了30天试用.
最关心的当然是iOS开发了,听说不再尴尬的需要FreePascal编译了,嘿嘿.

但是悲催的发现自己想简单了,其实还是需要一台Mac计算机,并且要安装XCODE的.不过这个也没问题,如果Delphi确实可以做到一个套代码,随便就可以开发出Windows,Mac,iOS,未来可能还会有Android/WindowsPhone的话,这点要求还是不算什么的.

不过我手头倒是没有Mac计算机,明天到公司再试吧.先往下看看.

手头没有Mac计算机,也没有iOS模拟器,本来以为没法编译看一眼了,突然发[......]

全文阅读

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

Delphi2007以后编译器进步的简单测试

刚刚看了有个兄弟用最新的FreePascal和Delphi7的编译器评测.觉得有点不公平.毕竟D7是10年前的产品.现在Delphi都出到XE3了.

用了个简单的代码测试了一下Delphi编译器的变化.

涵盖Delphi的版本XE3,XE2,XE,2007

测试代码如下

program matrix;

{$APPTYPE CONSOLE}
{$DEFINE USEINLINE}

uses
Windows;

const
SIZE = 30;
msg =
{$IFDEF DEBUG}
'Debug Version'
{$ELSE}
'Rel[......]

全文阅读

发表在 Delphi | 73条评论

RAD XE3 上海发布会见闻

当时是约了8个同道弟兄一块去的,没征得他的们的同意,没他们的照片.

XE3的livebinding被李维用起来非常帅,不知道实战效果会怎么样.

WIN8的非原生支持李维解释起来也有道理,就是XE3开发的Metro风格程序可以在XP,WIN7上正常运行.

计划12月发布的BCB64位的支持是支持最新的C++标准的,但是我特意问了一下和32位代码兼容情况,李维的解释是32位BCB不支持最新CPP标准,也就是如果你用BCB64+最新CPP语法,那么暂时不能移植回32了,所以要跨WIN32/WIN64平台的BCB兄弟们就暂时不要用最新的CPP语法.

Mobile Studio的[......]

全文阅读

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

XE3中Helper的增强.

XE3之前就有想法如果能给String甚至任意类型增加Helper函数有多方便.

每个版本Delphi刚出来我都会试一下Helper能否给简单类型”打补丁”.

自从上次发现XE3有String Helper以后试了一下,现在XE3基本上可以给大多数类型打补丁了,除了Interface类型以外.


type
THInteger = record helper for Integer
function ToStr():String;
end;

THDateTime = record Helper for TDateTime
function GetDate()[......]

全文阅读

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

XE3的String Helper

Delphi XE3增加了字符串的辅助功能.可以像操作一个结构体或者类一样操作字符串了.也就是给字符串追加了成员方法.

procedure TForm5.Button1Click(Sender: TObject);
begin
Caption := ‘abc’.ToUpper; //大写ABC
Caption := string.create(‘a’,20);? //20个a
Caption := Inttostr(‘哈哈’.Length);
end;

看上去很神奇吧.

在sysutils单元

TStringSplitOptions = (None, Excl[......]

全文阅读

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

关掉64位系统中32位程序的目录重定向

在64位Windows系统中运行的32位程序会被系统欺骗.

例如windows\system32的目录实际是windows\syswow64目录的映射.

program files实际是program files(x86)的映射.

注册表的hkey_local_machine\software实际是hkey_local_machine\software\wow6432node子键的映射.

那么如何访问到真正的64位程序的目录和注册表呢?

关掉目录重定向即可.

关闭文件的重定向


var
 OldWow64RedirectionValue: Long[......]

全文阅读

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

判断当前进程是否以管理员权限启动的


uses
 shlobj;
 type
 WELL_KNOWN_SID_TYPE = (
 WinNullSid,
 WinWorldSid,
 WinLocalSid,
 WinCreatorOwnerSid,
 WinCreatorGroupSid,
 WinCreatorOwnerServerSid,
 WinCreatorGroupServerSid,
 WinNtAuthoritySid,
 WinDialupSid,
 WinNetworkSid,
 WinBatchSid,
 WinInteractiveSid,
 WinServiceSi[......]

全文阅读

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

DelphiXE3的FireMonkey的体积我实在无语了.

建立一个空的FireMonkey的HD工程,就一个主窗口.

编译出来Debug版20MB多.Release版8MB多.

不知道功能和速度上怎么样.不然实在找不到亮点啊

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

PNG分割

Delphi新版本虽然集成了PngImage但是分割复制什么的却非常难用.稍微封装了一下.可以把一张PNG横向分割成N张.透明通道什么的都可以保持不变.

//2013.7.22代码做了改动,变成按行和列切割.CopyPng也做了处理,可以拷贝任意区域
type
  TPngArray = array of TPngImage;

{把一个PNG拷贝到另一个PNG中,带透明通道}
procedure CopyPng(const Src: TPngImage; dest: TPngImage;
  const SrcX, SrcY, DestX, DestY, Width,[......]

全文阅读

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

C++的MemoryStream,和Delphi/BCB基本兼容

只有一个头文件.


/*
CMemoryStream
学过Delphi和BCB的同学懂的.
只要引用这个头文件即可.
*/
#pragma once

#include &amp;lt;Windows.h&amp;gt;

enum SEEK_ORIGIN
{
SO_BEGINNING??? = 0,
SO_CURRENT????? = 1,
SO_END????????? = 2
};

class CMemoryStream
{
public:

explicit CMemoryStream(int nMemoryDelt[......]

全文阅读

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