分类目录归档:Delphi

Delphi….

[原] Delphi加密解密控件DCPcrypt的RC4实现bug

作者David Barton网站:http://www.cityinthesky.co.uk/opensource/dcpcrypt
DCPcrypt v2 contains full implementations of the following algorithms:
Encryption Algorithms Hash Algorithms
Blowfish Haval
Cast 128 MD4
Cast 256 MD5
DES, 3DES RipeMD-128
Ice, Thin Ice, Ice2 RipeMD-160
IDEA SHA-1
Mars SHA-256, SHA-384, SHA-512
Misty1 Tiger
RC2, RC4, RC5, RC6
Rijndael (the AES)
Serpent
Tea
Twofish
不过我试了最新的控件,RC4实现还是有bug:8192字节后,加密的数据不是标准的。(和C语言比)
如果你全都用这个控件来实现RC4的加密/解密,或者数据块不超过8192字节,那没有问题;
不过如果你跨语言了(即用Delphi加密,其他语言解密;或者其他语言加密,Delphi解密),而且数据块超过8192字节,那一定会遇到这个bug:8192字节后的加密/解密内容不匹配。

【补充】经过阅读代码,我发现了这个bug的原因:
在 DCPcrypt2.pas 中, 当调用 TDCP_cipher.EncryptStream 时,作者把Stream 按照8192字节分成几部分,然后对每一部分调用Encrypt函数。问题就出在这里,因为RC4的算法,KeyData[0..255]这个数组是不断在变化的。作者分块以后,调用Encrypt()偏移量又重新从下标0开始算。就会导致问题:

[原] bolt官方示例项目HelloBolt的Delphi实现(上)

使用Delphi实现官方示例项目HelloBolt。 作者bianbian (http://bianbian.org bianbian.org@gmail.com 2307504@qq.com)

Wiki地址:https://code.google.com/p/bolt-for-delphi/wiki/HelloBoltDelphi

Introduction

HelloBolt系列教程通过7个课时由浅到深的讲解BOLT界面引擎的关键概念。 前面1-6个教程主要在讲述XML+Lua实现界面,只有第1个教程涉及VC++环境的搭建,第7个教程讲述C++代码与Lua环境的交互。 那么作为Delphi环境的移植,就主要分述两块内容:1)支持Bolt的Delphi环境搭建 2)Delphi与Lua的交互。使用XML+Lua实现界面的部分请参照原教程。

支持Bolt的Delphi环境搭建

主要是实现Bolt的DLL头文件的转换,即从C语言转换到Pascal。 为了完成HelloBolt系列用到的api,需要转换的是:XLUE.h、XLGraphic.h、XLLuaRuntime.h。 以XLUE.h为例,转换后的XLUE.pas为:(只转换了HelloBolt系列用到的api)

实现头文件后,就可以编写Delphi实现代码(所有课程唯一区别就是“XLUE_LoadXAR(HelloBolt#);”这句,其中#为1-7):

至此,就已实现HelloBolt的1-6课内容。

[原] 新建了一个google code项目:bolt for delphi

移植优秀DirectUI界面引擎Bolt到Delphi环境
地址:http://code.google.com/p/bolt-for-delphi/
“Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库。迅雷7是首个采用该引擎成功开发的产品,目前迅雷旗下大部分客户端产品都基于该引擎开发,并稳定运行于超过3.5亿台PC上。”

Bolt界面引擎详见:http://bolt.xunlei.com

官方Bolt需要使用XML、Lua、C++。 本项目将Bolt进行移植,最终实现在Delphi环境中无缝使用Bolt引擎,即使用Delphi + XML + Lua实现DirectUI。

[原]关于Indy组件(Delphi)实现FTP上传断点续传的方法 (upload resume)

Indy不仅支持下载断点续传,也支持上载断点续传,而且不需要对Indy做出改造。
在Blues的blog,他提到可以“通过IDFTP得到服务端已经上传的部分的SIZE,然后通过文件流在本地建立剩余部分的临时文件,然后以APPEND方式上传,传完后删除临时文件,达到上传断点续传的效果”。原文在此:DELPHI ftp 上传断点续传的实现
我再仔细看了Indy的源码,发现不需要临时文件。可以对Blues的方法作出重大改进:
Put()方法第一个参数可以是TStream(实际上,如果是文件名的话Indy会建立Stream,然后再调用Stream的Put方法)。而且如果Append设为True的话,Indy不会去动Stream的Position:

也就是说,先把原文件的Stream Seek到Size位置,丢给Indy即可,实现也很简单:

[唉]Delphi怎么没有三目运算符(也叫三元运算符)

虽然自己写了一个iif函数,还是有问题的:

问题是传进的参数事先是已经被计算出值了,就会导致问题:

1)重复计算。比如:如果bool为真,输出txt,否则在之前加几个空格再输出txt

如果bool为真,按三目运算的规则,' ' + txt 是不会执行到的。不过这里做参数,只能重复计算,效率比if else 低

2)避免不了某些会导致异常的代码
原因还是因为参数会事先计算。比如:如果是目录,输出0,否则输出文件最后修改时间:

如果PathFileName是目录,FileAge()函数会抛出异常。
按三目运算规则,异常的代码是不应该被执行到的;但这里作参数,一旦是个目录每次必定抛异常,还得改成if else

还没想到好的解决办法,难道用Callbak函数回调?太夸张了点。。。。汗。。。。。

[原] TP-Link拨号/断开程序

万恶的南京电信好贵啊,,,,,我的套餐是一个月360小时,2M带宽,168元/月
路由器不可能一直联网,需要手动拨号。不过每次都连上192.168.1.1也太麻烦了。
于是写了个程序自动拨号、断开。程序启动就会连上路由器拨号,关闭的时候会断开连接。
tp_link.JPG
需要的朋友请下载(仅适用于TP-Link路由器):tp_link.zip

[原] 改进的DOS命令输出重定向到文本框(TMemo)内

虽然是Delphi的,都是调用的WinAPI,C++也可参考。
原理就是管道(Pipe),自己的程序可以Create管道出来,让CreateProcess的子程序能继承自己程序里的管道,替代子程序的标准输入输出。
这样DOS程序对stdout输出的内容就输出到自己程序建立的管道里来了,也就能对其进行读取操作,从而完成重定向到文本框(实时显示)。

基本上Delphi世界里流行的都是DFW上的那个重定向代码,我进行了改进:
1)原来那个代码只能截取输出结果,但是没有换行的整理,要是直接Add到Memo里会杂乱不堪(因为循环取到的内容有可能含有 \r 或 \n,这时候直接Add就有了两行)。
我加上了换行符的处理,Add行的时候按实际的换行进行处理,这样和DOS窗口输出就一致了。
2)原来那个代码没有和Memo绑定,还得自己写Memo操作部分
我加上了Memo作为参数,这样直接调用就省事了。

使用的时候只要 CmdExecAndView(“命令”, memo) 即可。

下面是改进后的代码,欢迎交流:

[原]用内嵌IE做软件界面的几点体会

做人要厚道,转载请用链接形式标明出处,谢谢合作。

内嵌IE做软件界面是比较方便和流行的,如.NET 2003的安装程序(好像2005也是,不太记得了)。主要是随便插入图片阿、字体阿什么的。不过因为是内嵌IE,保持了大部分IE的特性,但是这些特性稍不注意,在软件界面看起来却是BUG(或者换句话说,用户很明显地发觉这是个网页…)。比如.NET 2003的安装程序,右键点击会出现IE浏览网页时的右键菜单就是个BUG:
.NET 2003 setup
或者呢,按住Shift,点击网页内那些链接,会发现新开了个IE窗口显示,这样连存放的文件名也暴露了。

当然了,BUG还不仅如此:虽然这个主要的内嵌IE不支持文件拖入(会显示禁止drop的图标),但是安装时右上角不停变化的图片处其实也是个内嵌IE——这里Microsoft显然遗漏了禁止drop的处理——你用鼠标拖个htm文件过去,会发现是可以drop的(直接用PrintScreen截的,没有鼠标,不过能看到拖过去的htm图标),如图:
dotnet2003-2.JPG

那么针对这些问题,我说一下用内嵌IE做软件界面的几点体会:
(1)避免script error。(今天没有空,内容待补充,下同)
(2)去掉右键菜单。
(3)禁止拖入。
(4)禁止打开新窗口。
(5)往内嵌IE里写入数据。
(6)截获页面跳转执行相应的代码,换句话说就是和主程序交互。
(7)这点可能是Delphi 7特有的bug,Delphi自带的TWebBrowser不支持键盘:如回车键提交表单等。

[原]Delphi调用ShellAPI删除整个目录(我觉得是最快的方法)