Inno Setup 5.4 with CodeSign Support
1. 添加签名工具命令行,参数类似于:
SignCode=$qSignTools\signtool.exe$q sign /f $qCerts\[Certificate].pfx$q -d $q[Software Name or Company]$q -du $q[http://www.mydomainhost.com]$q /t $qhttp://timestamp.comodoca.com/authenticode$q $f
其中[Certficate]请使用实际的数字证书文件名代替,[Software Name or Company]使用一个有用的提示信息或标签,比如软件的名称或公司的名称,[http://www.mydomainhost.com]使用公司或软件的网址
2.代码[Setup]节添加如:SignTool=SignCode,启用代码签名,此处如果没有其他配置则会对卸载程序和安装程序进行签名
3.[Files]节点当中对具体的文件添加“;SignCode: Yes ”启用对该文件(或文件组当中所列的文件,仅Window PE可执行文件或称程序文件)进行签名
4.可以参考附图,也可以参考帮助文件
5. 本程序根据官方5.4版本进行修改,主要是添加了对程序文件的签名,目的是在打包的时候可以很方便的一次性对所须文件进行签名,而省去麻烦
Base64.dll(Base64编解码,附VB示例)
Base64编码和解码库,支持API调用和COM调用,输入参数支持VB的字节数组Byte(),输出支持VB的字节数组Byte()和字符串String。编码速度大约为每秒钟256MB~380MB。
内附一个比较三方提供的比较经典的库VBVorLib,其性能也相当不错。本程序库比之稍快,内附截图。
Public Declare Sub Encode Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte)
Public Declare Sub EncodeToVBString Lib "Base64" (ByRef Dest As Any, ByRef Src() As Byte)
Public Declare Sub EncodeToVaraint Lib "Base64" (ByRef Dest As Variant, ByRef Src() As Byte)
Public Declare Sub EncodeWithEOL Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte)
Public Declare Sub EncodeToVBStringWithEOL Lib "Base64" (ByRef Dest As Any, ByRef Src() As Byte)
Public Declare Sub EncodeToVaraintWithEOL Lib "Base64" (ByRef Dest As Variant, ByRef Src() As Byte)
Public Declare Sub Decode Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte)
Public Declare Sub DecodeEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src() As Byte)
Public Declare Sub DecodeFromVBString Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)
Public Declare Sub DecodeFromVBStringEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)
Dell Latitude D630 BIOS A17(SLIC 2.1,支持Windows7)
Dell Latitude D630 的BIOS更新程序,通过修改官方的A17版本由SLIC2.0更新为SLIC2.1,安装之后,Dell OEM版本Windows7可以顺利激活。
Indy10_Tiburon(SVN:4445) for C++Builder2007&C++Builder2010
参考贴子:http://topic.csdn.net/u/20100929/14/11329986-0714-488e-9a30-e6d3b60bd5bd.html
为Windows平台浏览器注册自己的协议+跨进程参数传递
详细请参考http://topic.csdn.net/u/20090413/17/95324fd2-c830-44f3-af6f-7c98441eb641.html?seed=463571679
MDAC Utility: Component Checker
来源:http://www.microsoft.com/downloads/details.aspx?FamilyID=8f0a8df6-4a21-4b43-bf53-14332ef092c9&displaylang=en&Hash=c5tFzN%2blL6R9cdiiknOWzEnHnOeoIpQWyS7Hi0KXFp3KbUl1tOlnlA9fMDaCtI3T32mggAqU533lZ7fzHKzvIw%3d%3d
SFTP Demo for Delphi
SFTP/SSH Demo for Delphi.
Delphi6&2007&2009(Demo&Source)
Delphi6 Demo
Delphi6 Source
Delphi2007 Demo
Delphi2007 Source
Delphi2009 Demo
Delphi2009 Source
DCOM-Based Sharing Object between processes Demo In Delphi
Delphi版基于DCOM的进程间对象(内存)共享示例,希望对需要的朋友有所帮助。
测试办法:
1.先执行:注册.bat;
2.启动两个或多个SharedObject_Test.exe进程;
3.在某一个画面当中的Name输入一个名字,并设置Value,然后按下SetValue;
4.在其它进程当中输入同样的Name,然后按下GetValue
如果是用户(客户进程)量大,会导致启动多个服务进程的话,那么建议把服务进程配置是“交互式用户”,具体的操作,运行DCOMCNFG.exe,然后展开到DCOM,找出相应的DCOM组件(本例为:CoShareObject Object),然后右键,在弹出的菜单当中选择[属性],转到[标识]页,把运行该程序的用户配置为“交互式用户”(默认为“启动用户”)
单元补充:
unit UnitManagedObject;
interface
uses
Windows
;
type
TManagedObject = class(TObject)
{Management Properties}
private
FManagementCount : Integer; //对象引用计数
public
{structor}
constructor Create;
public
{Management}
procedure Free;
function Attach:TManagedObject;
function Detach: Integer;
end;
implementation
{TManagedBaseObject}
{structor}
constructor TManagedObject.Create;
begin
Inherited Create;
FManagementCount := 1;
end;
{Management}
function TManagedObject.Attach : TManagedObject;
begin
Result := Nil;
if InterlockedIncrement(FManagementCount) = 1 then
begin
InterlockedDecrement(FManagementCount);
Exit;
end;
Result := self;
end;
function TManagedObject.Detach : Integer;
begin
Result := InterlockedDecrement(FManagementCount);
end;
procedure TManagedObject.Free;
begin
if Detach>0 then
Exit;
Inherited;
end;
end.
[Doc] using ADO with Oracle In Delphi
using ADO with Oracle In Delphi MSWord Document
CodeGear RAD 2007&2009 Runtime Library
CodeGear Rad 2007 and 2009 Runtime Library
rtl120.bpl,vcl120.bpl,rtl100.bpl,vcl100.bpl
制作资源DLL的示例
资源DLL示例,使用Microsoft Resource Compiler,较好的支持Unicode.
BCB6Update4
Borland C++ Builder 6 Enterprise English Update4.
Microsoft Make CAB Tools
Microsoft Make CAB Tools
GBK与BIG5的转换工具DLL
一个通过查表方式完成转换的DLL,支持COM和API两种方式调用.内附Delphi和VB的Demo.
RAD 2009 VCL Source
Delphi 2009 VCL Source,希望对某些朋友有所用处。
Windows快捷方式文件的格式说明(英文版,PDF)
Windows快捷方式文件的格式说明(英文版)
希望对大家有用.
(PS:据说现在可用分可以更换资源积分,就黑一点吧,哈哈)
IOCP完成端口代码(C++Builder)
以前刚学习IOCP的时候用C++Builder写的代码,基本除了一些property之类的是C++Builder特有的以外,稍做修改也可以用到其它C++编译器上.
起始使用C++Builder6写的,后来有使用C++Builder2006及C++Builder2007重新编译过,所以基本这三个版本都可以很好地支持.其中代码几乎完全使用的API+vector.
仅供学习参考.
基本Zlib的压缩/解压缩组件(同时支持API接口和COM接口
为方便VB应用的开发,特开发此组件.可以支持几乎所有VB当中的原生类型的压缩(需要通过Variant).
简单实例:
Dim str As String
Dim packed_bytes As Variant
Dim unpacked_bytes As Variant
str = "随便测试一个相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长的字符串"
'压缩
packed_bytes = str 'StrConv(str, vbFromUnicode)
MsgBox "压缩前字节数:" & LenB(packed_bytes)
Call PackStream(packed_bytes)
MsgBox "压缩后字节数:" & (UBound(packed_bytes) - LBound(packed_bytes) + 1)
'解压缩
unpacked_bytes = packed_bytes
MsgBox "解压缩前字节数:" & (UBound(unpacked_bytes) - LBound(unpacked_bytes) + 1)
Call UnPackStream(unpacked_bytes)
MsgBox "解压缩后字节数:" & LenB(unpacked_bytes)
str = unpacked_bytes 'StrConv(unpacked_bytes, vbUnicode)
MsgBox str
基于Zlib的压缩/解压缩组件
Dim str As String
Dim packed_bytes As Variant
Dim unpacked_bytes As Variant
str = "随便测试一个相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长相当长的字符串"
'压缩
packed_bytes = StrConv(str, vbFromUnicode)
MsgBox "压缩前字节数:" & LenB(packed_bytes)
Call PackStream(packed
OverByte.ICS.WSocket.V6.RC1(SSL Enabled)
Overbyte 发布的Ics套件V6 Release Candidate 1版本,加入了SSL(OpenSSL)支持.
Indy10.2.3.BCB2007
Last update 2008-07-23<br>2008-08-22,从http://indy.fulgan.com/ZIP/indy10.zip<br>下载,并增加C++Builder的Package.<br>安装时,只需要打开根目录下的Indy10.2.3_cb2007.groupproj(Delphi:Indy10.2.3_d2007.groupproj),<br>然后到菜单View下选择Project Manager(热键Ctrl+Alt+F11)<br>然后在Project Manager当中,对各bpl按顺序<br>IndySystem110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>IndyCore110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>dclIndyCore110.bpl,选中,右击,然后选择Install(在弹出的菜单当中按I键)<br>IndyProtocols110.bpl,选中,右击,然后选择Build(在弹出的菜单当中按B键)<br>dclIndyProtocols110.bpl,选中,右击,然后选择Install(在弹出的菜单当中按I键)<br><br>选择菜单Tools->Options...<br>Environment Options->C++ Options->Paths and Directories下面设置Include Path和Library Path.
Delphi使用ADO连接池(存储过程示例)
一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制
===================
unit UnitDemo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
//数据库服务器
gDBServer: String = '127.0.0.1';
//数据库名称
gDBName: String = 'master';
//数据库用户名
gDBUser: String = 'sa';
//密码
gDBPass: String = '2001';
implementation
{$R *.dfm}
uses
ADODB,
UnitADOConnectionPool;
const
CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+
'as'#13#10+
'select * from sysobjects where xtype=@type'#13#10+
'return @@rowcount';
DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+
' drop procedure TestMyPool';
var
gPoolMan: TADOConnPoolMan = Nil;
procedure TForm2.Button1Click(Sender: TObject);
var
ADOObject:TADOConnPoolObject;
ADOStoredProc:TADOStoredProc;
Running :Integer;
I: Integer;
begin
//取得一个存储过程资源(含一数据库有效连接)
ADOObject := gPoolMan.CreateSP('TestMyPool');
if ADOObject = Nil then
//取得资源失败
Exit;
try
ADOStoredProc := ADOObject.ExecObject as TADOStoredProc;
Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连
while Running>0 do
begin
Dec(Running);
if ADOObject.NeedRefresh then
begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连)
if Not ADOObject.Reconnect then
Exit;
ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh;
if ADOObject.NeedRefresh then
Exit;
end;
for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do
begin
//=========================
//传递参数
ADOStoredProc.Parameters.Items[I].Value := 'U';
//=========================
end;
if Running 0 then
try
//执行存储过程
ADOStoredProc.Open;
//执行存储过程成功,退出循环进入后续的数据处理
break;
except
On E:Exception do
begin
//执行失败非程序级的异常通常有两种可能:
//1.数据库连接断开
//2.自适合的参数传递当中可能存储过程已更新,参与不一致
//设置重连标志
ADOObject.NeedRefresh := True;
//===================
//这里记录数据库操作失败日志
//===================
end;
end;
Exit;
end;
//==========================
//从ADOStoredProc当中读取记录
ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value));
//==========================
//关闭存储对象的资源
ADOStoredProc.Close;
finally
//调用结束,释放资源
ADOObject.Free;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
ADOConn:TADOConnection;
begin
(****************BEGIN*******************)
(*注:仅为测试准备 *)
//初始化测试环境
ADOConn := Nil;
if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then
Exit;
try
ADOConn.Execute(DeleteSQL);
ADOConn.Execute(CreateSQL);
finally
try
ADOConn.Close;
except
end;
ADOConn.Free;
end;
(*****************END********************)
//初始化连接池
gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true);
end;
procedure TForm2.FormDestroy(Sender: TObject);
var
ADOConn:TADOConnection;
begin
//释放连接池
if Assigned(gPoolMan) then
gPoolMan.Free;
(****************BEGIN*******************)
(*注:仅为测试准备 *)
//清理测试环境
ADOConn := Nil;
if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then
Exit;
try
ADOConn.Execute(DeleteSQL);
finally
try
ADOConn.Close;
except
end;
ADOConn.Free;
end;
(*****************END********************)
end;
end.
线程安全日志记录器
(******************************************************************************)<br>(* 模 块 名: HSLogger4D.Pas *)<br>(* 别 名: 多任务线程安全日志接口-进程独立版 *)<br>(* 作 者: Unsigned(僵哥) *)<br>(* 说 明: 基于线程安全和文件缓存的单例多线程同步日志记录接口,本接口由一个 *)<br>(* Delphi版本的动态链接库来提供相应的功能,采用Delphi的 String 类型 *)<br>(* 传递参数,使用时请注意调用方式与Delphi一致,不建议使用于 Delphi *)<br>(* 以外的语言环境,由此所引发的后果,作者不承担任何责任 *)<br>(* 附带文件: HSLogger4D.DLL *)<br>(* 版 本 号: 1.1 *)<br>(* 创 建 于: 2007-07 *)<br>(* 备 注: 本接口属进程独立版不处理多进程间同步 *)<br>(* *)<br>(* 修改记录: 2007-07-13 创建最初版本 *)<br>(* 2007-07-14 修正多线程内存管理冲突 *)<br>(******************************************************************************)<br><br>unit HSLogger4D;<br><br>interface<br>uses<br> Windows;<br>(*********************************)<br>(* 功 能:记录日志 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:日志内容,自行控制换行符 *)<br>(* 参数3:记录日志后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(* 返回值:0=成功,非0=LastError *)<br>(*********************************)<br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL<br> ) : DWORD;overload;<br><br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String<br> ) : DWORD;overload;<br>(*********************************)<br>(* 功 能:关闭日志文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:记录日志文件关闭后是否 *)<br>(* 释放其它相关资源 *)<br>(*********************************)<br>procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL = true<br> );<br><br>(*********************************)<br>(* 功 能:关闭所有日志文件 *)<br>(* 参数1:记录日志文件关闭后是否 *)<br>(* 释放其它相关资源 *)<br>(*********************************)<br>procedure CloseAllFile(<br> FreeAfterClose : BOOL = false<br> );<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:写入文件后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(* 返回值:0=失败,非0=成功 *)<br>(*********************************)<br>function FlushFileToDisk(<br> FileName : String;<br> CloseFileAfterFlush : BOOL = true<br> ) : BOOL;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:写入文件后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(*********************************)<br>procedure FlushAllFileToDisk(<br> CloseFileAfterFlush : BOOL = false<br> );<br><br>var<br> CloseFileAfterWrote:BOOL=false;<br><br>implementation<br><br>(******************************************************************************)<br>(* *)<br>(* <<日志接口定义>> *)<br>(* 注:请保持与源接口一致 *)<br>(******************************************************************************)<br>type<br> (*Logger Interface*)<br> ILogger=interface<br> ['{E43E419D-26AD-48e6-8097-19622CC2043E}']<br> function WriteLog(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL = true<br> ) : DWORD;<br><br> procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL = true<br> );<br><br> procedure CloseAllFile(<br> FreeAfterClose : BOOL = true<br> );<br><br> function FlushFileToDisk(<br> FileName : String;<br> CloseFileAfterFlush : BOOL = true<br> ) : BOOL;<br><br> procedure FlushAllFileToDisk(<br> CloseFileAfterFlush : BOOL = true<br> );<br> end;<br><br> (*Logger Import statement*)<br> function HSLoggerObject: ILogger; stdcall;<br> external 'HSLogger4D.dll'<br> name 'HSLoggerObject';<br><br>(*Write Log-String to file*)<br>(*********************************)<br>(* 功 能:记录日志 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:日志内容,自行控制换行符 *)<br>(* 参数3:记录日志后是否关闭文件 *)<br>(* (不会释放其它资源) *)<br>(*********************************)<br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String;<br> CloseFileAfterWrote : BOOL<br> ) : DWORD;<br>begin<br> Result:=HSLoggerObject.WriteLog(<br> FileName,<br> LogString,<br> CloseFileAfterWrote<br> );<br>end;<br><br>function WriteLogThreadsafe(<br> FileName : String;<br> LogString : String<br> ) : DWORD;<br>begin<br> Result:=WriteLogThreadsafe(<br> FileName,<br> LogString,<br> CloseFileAfterWrote<br> );<br>end;<br><br>(*Close one Logfile,and free logfile-Object if FreeAfterClose was set to TRUE*)<br>(*********************************)<br>(* 功 能:关闭日志文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:记录日志文件关闭后是否 *)<br>(*********************************)<br>procedure CloseFile(<br> FileName : String;<br> FreeAfterClose : BOOL);<br>begin<br> HSLoggerObject.CloseFile(<br> FileName,<br> FreeAfterClose<br> );<br>end;<br><br>(*Close All Logfile,and free logfile-Object if FreeAfterClose was set to TRUE*)<br>(*********************************)<br>(* 功 能:关闭所有日志文件 *)<br>(* 参数1:记录日志文件关闭后是否 *)<br>(*********************************)<br>procedure CloseAllFile( FreeAfterClose : BOOL = false );<br>begin<br> HSLoggerObject.CloseAllFile(FreeAfterClose);<br>end;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:日志文件名,支持相对路径 *)<br>(* 参数2:写入文件后是否关闭文件 *)<br><br>(* 返回值:0=失败,非0=成功 *)<br>(*********************************)<br>function FlushFileToDisk( FileName : String;<br> CloseFileAfterFlush : BOOL<br> ) : BOOL;<br>begin<br> Result:=HSLoggerObject.FlushFileToDisk(<br> FileName,<br> CloseFileAfterFlush<br> );<br>end;<br><br>(*********************************)<br>(* 功 能:强制缓存写入文件 *)<br>(* 参数1:写入文件后是否关闭文件 *)<br>(*********************************)<br>procedure FlushAllFileToDisk( CloseFileAfterFlush : BOOL );<br>begin<br> HSLoggerObject.FlushAllFileToDisk(CloseFileAfterFlush);<br>end;<br>end.
BDS2007授权文件
CodeGear RAD Studio 2007 Architect Trial<br>License File