delphi编程经典源码总结.docx
- 文档编号:30568840
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:47
- 大小:33.08KB
delphi编程经典源码总结.docx
《delphi编程经典源码总结.docx》由会员分享,可在线阅读,更多相关《delphi编程经典源码总结.docx(47页珍藏版)》请在冰豆网上搜索。
delphi编程经典源码总结
个人收集资料系列
Delphi精典技艺
问:
如何让del+CTRL+ALT看不见程序运行?
答:
为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:
functionRegisterServiceProcess(dwProcessID,dwType:
Integer):
Integer;stdcall;external'KERNEL32.DLL';
再在上面的窗口Create事件加上一句:
RegisterServiceProcess(GetCurrentProcessID,1);//隐藏
也可以使用下面的函数:
functionMy_SelfHide:
Boolean;
type
TRegisterServiceProcess=function(dwProcessID,dwType:
DWord):
DWORD;stdcall;
var
hNdl:
THandle;
RegisterServiceProcess:
TRegisterServiceProcess;
begin
Result:
=False;
ifWin32Platform<>VER_PLATFORM_WIN32_NTthen//不是NT
begin
hNdl:
=LoadLibrary('KERNEL32.DLL');
RegisterServiceProcess:
=GetProcAddress(hNdl,'RegisterServiceProcess');
RegisterServiceProcess(GetCurrentProcessID,1);
FreeLibrary(hNdl);
Result:
=True;
end
else
Exit;
end;
问:
自我拷贝法怎么样使用?
答:
这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序.
打开Delphi,新建一个工程,在窗口的Create事件中写代码:
procedureTForm1.FormCreate(Sender:
TObject);
varmyname:
string;
begin
myname:
=ExtractFilename(Application.Exename);//获得文件名
ifapplication.Exename<>GetWindir+mynamethen//如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{将自己拷贝到Windows\System\下}
Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end;
end;
其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径.
functionGetWinDir:
String;
var
Buf:
array[0..MAX_PATH]ofchar;
begin
GetSystemDirectory(Buf,MAX_PATH);
Result:
=Buf;
ifResult[Length(Result)]<>'\'thenResult:
=Result+'\';
end;
问:
如何避免同时运行多个相同程序?
答:
为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.
一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序.
修改dpr项目文件,修改begin和end之间的代码如下:
begin
Application.Initialize;
ifFindWindow('TForm1','Form1')=0thenbegin
//当没有找到Form1时执行下面代码
Application.ShowMainForm:
=False;//不显示主窗口
Application.CreateForm(TForm1,Form1);
Application.Run;
end;
end.
另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。
“冰河”就是用这种方法的。
这样做的好处在于方便升级.它会自动用新版本覆盖旧版本.
方法如下:
修改dpr项目文件
uses
Forms,windows,messages,
Unit1in'Unit1.pas'{Form1};
问:
如何能使程序能在windows启动时自动启动?
答:
为了程序能在Windows每次启动时自动运行,可以通过六种途径来实现.“冰河”用注册表的方式。
加入Registry单元,改写上面的窗口Create事件,改写后的程序如下:
procedureTForm1.FormCreate(Sender:
TObject);
constK='\Software\Microsoft\Windows\CurrentVersion\RunServices';
varmyname:
string;
begin
{WritebyLovejingtao,http:
//L,Lovejingtao@}
myname:
=ExtractFilename(Application.Exename);//获得文件名
ifapplication.Exename<>GetWindir+mynamethen//如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{//将自己拷贝到Windows\System\下}
Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end;
withTRegistry.Createdo
try
RootKey:
=HKEY_LOCAL_MACHINE;
OpenKey(K,TRUE);
WriteString('syspler',application.ExeName);
finally
free;
end;
end;
问:
怎么才能把自己的程序删除掉?
答:
很简单,可以写一个BAT文件
例如:
a.bat
del%0
这样就把a.bat删除掉了!
放一个例子:
用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:
del%0,然后运行它,怎么样?
a.bat把自己删除掉了!
!
!
好,我们就用它来进行程序的“自杀”!
找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为:
:
pp
delabc.exe
ifexistabc.exegotopp
del%0
先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!
!
!
按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。
运行Delphi,新建一个工程,添加一个Button到窗体上,点击Button,写下如下代码:
procedureTForm1.Button1Click(Sender:
TObject);
varSelfname,BatFilename,s1,s2:
string;
BatchFile:
TextFile;
begin
Selfname:
=Extractfilename(application.exename);//取EXE文件自己的名称
BatFilename:
=ExtractFilePath(Application.ExeName)+'a.bat';//批处理文件名称
S1:
='@del'+Selfname;
S2:
='ifexist'+Selfname+'gotopp';
assignfile(BatchFile,BatFilename);
rewrite(BatchFile);
writeln(BatchFile,':
pp');
writeln(BatchFile,S1);
writeln(BatchFile,S2);
writeln(BatchFile,'@del%0');
closefile(BatchFile);
winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat
application.Terminate;//退出程序
end;
那我们的事情是不是就完了?
NO!
上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows\System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。
那怎么办?
别急,我们请出一个函数CreateProcess,它的原型为:
BOOLCreateProcess(
LPCTSTRlpApplicationName,//pointertonameofexecutablemodule
LPTSTRlpCommandLine,//pointertocommandlinestring
LPSECURITY_ATTRIBUTESlpProcessAttributes,//pointertoprocesssecurityattributes
LPSECURITY_ATTRIBUTESlpThreadAttributes,//pointertothreadsecurityattributes
BOOLbInheritHandles,//handleinheritanceflag
DWORDdwCreationFlags,//creationflags
LPVOIDlpEnvironment,//pointertonewenvironmentblock
LPCTSTRlpCurrentDirectory,//pointertocurrentdirectoryname
LPSTARTUPINFOlpStartupInfo,//pointertoSTARTUPINFO
LPPROCESS_INFORMATIONlpProcessInformation//pointertoPROCESS_INFORMATION
);
这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。
由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。
用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。
运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下:
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TForm1=class(TForm)
Button1:
TButton;
procedureMy_DeleteMe;//自定义程序自杀过程
procedureButton1Click(Sender:
TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:
TForm1;
implementation
{$R*.DFM}
procedureTForm1.Button1Click(Sender:
TObject);
begin
My_DeleteMe;
end;
procedureTForm1.My_DeleteMe;//程序自杀
//-----------------------------------------------------------
functionGetShortName(sLongName:
string):
string;//转换长文件名
var
sShortName:
string;
nShortNameLen:
integer;
begin
SetLength(sShortName,MAX_PATH);
nShortNameLen:
=GetShortPathName(PChar(sLongName),
PChar(sShortName),MAX_PATH-1);
if(0=nShortNameLen)then
begin
//handleerrors...
end;
SetLength(sShortName,nShortNameLen);
Result:
=sShortName;
end;
//-------------------------------------------------
var
BatchFile:
TextFile;
BatchFileName:
string;
ProcessInfo:
TProcessInformation;
StartUpInfo:
TStartupInfo;
begin
BatchFileName:
=ExtractFilePath(ParamStr(0))+'$$a$$.bat';
AssignFile(BatchFile,BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile,':
try');
Writeln(BatchFile,'del"'+GetShortName(ParamStr(0))+'"');
Writeln(BatchFile,'ifexist"'+GetShortName(ParamStr(0))+'"'+'gototry');
Writeln(BatchFile,'del%0');
Writeln(BatchFile,'cls');
Writeln(BatchFile,'exit');
CloseFile(BatchFile);
FillChar(StartUpInfo,SizeOf(StartUpInfo),$00);
StartUpInfo.dwFlags:
=STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow:
=SW_Hide;
ifCreateProcess(nil,PChar(BatchFileName),nil,nil,
False,IDLE_PRIORITY_CLASS,nil,nil,StartUpInfo,
ProcessInfo)then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
end.
补充:
1、上面的批处理的del%0等同于dela.bat,用dela.bat则批处理文件必须为a.bat,用del%0则可以随意。
2、所有程序在Pwin98+Delphi5、Win2000+Delphi5下运行通过。
本文的标题为《安装与卸载之卸载篇》,下次将介绍如何用Delphi制作自己的安装程序。
记得有一位著名的黑客说过:
我从来不去找什么工具软件,需要的话就自己写一个。
如果我们也持这种态度,则编程水平一定会越来越高。
问:
如何得到*******中的密码?
答:
这里有一个例子:
//***********************************************************8
//password_dos.dpr,陈经韬作品
//
//lovejingtao@
//***********************************************************8
programpassword_dos;
{$apptypeconsole}//设置程序为非图形界面
uses
windows,
messages;
consts:
boolean=true;//置循环标志
var
pass_edit_hwnd:
hwnd;//密码窗口句柄
p:
tpoint;//鼠标指针
begin
writeln;
writeln('**************************************************************************');
writeln;
writeln;
writeln('星号*密码破解器');
writeln('使用方法:
将鼠标移动到密码框,密码就会自动现形!
');
writeln('按Ctrl+C退出程序。
');
writeln('\\\|///');
writeln('\\--//');
writeln('(@@)');
writeln('+----------------------oOOo-(_)-oOOo---------------------+');
writeln('||');
writeln('|若在使用过程中发现任何问题或有新的想法请及时与我联系:
|');
writeln('|主页:
|');
writeln('|E-MAIL:
lovejingtao@|');
writeln('||');
writeln('|Oooo陈经韬2000.07|');
writeln('+----------------------oooO---()---------------------+');
writeln('())/');
writeln('\((_/');
writeln('\_)');
writeln;
writeln('**************************************************************************');
writeln;
whiles<>falsedobegin
getcursorpos(p);//查鼠标坐标
pass_edit_hwnd:
=WindowFromPoint(p);//返回句柄
SendMessage(pass_edit_hwnd,EM_SETPASSWORDCHAR,0,0);//发送消息
SendMessage(pass_edit_hwnd,WM_PAINT,0,0);//
SendMessage(pass_edit_hwnd,WM_KILLFOCUS,0,0);//刷新窗口
SendMessage(pass_edit_hwnd,WM_SETFOCUS,0,0);//
sleep(1000);//延时1000毫秒
end;
end.
问:
如何对注册进行操作?
答:
首先:
usesregistry;
var
r:
TRegistry
r:
=Tregistry.Create;
r.RootKey:
=HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER之类
r.OpenKey('Software\microsoft'之类,true);
然后就可以r.ReadString、r.ReadInteger、r.WriteString、r.WriteInteger之类
r.Free;
问:
怎么使用ini文件进行一些设置的保存?
答:
其实很简单,在uses中加入INIFiles然后可以在form的onCreate和onClose两个事件中写东西,onCreate是读出以前写的内容,onClose是写入更改过的内容,下面是一个例子:
放一个CheckBox和Edit
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ComCtrls,INIFiles;//INIFiles不要忘了加
procedureTForm1.FormClose(Sender:
TObject;varAction:
TCloseAction);
begin
WithTINIFile.Create('a.ini')do//创建a.ini
begin
WriteBool('MySetting','CheckBox1_Checked',CheckBox1.Checked);{保存到MySetting下面的CheckBox1_Checked子键下,然后把Checkbox1的是否按下状态写进去}
WriteString('MySetting','Edit1_Text',Edit1.Text);//同上
end;
end;
procedureTForm1.FormCreate(Sender:
TObject);//读入a.ini文件中的设置
begin
WithTINIFile.Create('a.ini')do//打开已创建的a.ini
begin
CheckBox1.Checked:
=ReadBool('MySetting','CheckBox1_Checked',False);{同上面的写入一样,这里是读取ReadBool和WriteBool是两个BOOL值的写入方法.}
Edit1.Text:
=ReadString('MySetting','Edit1_Text','');//同上
end;
end;
问:
如何能使一个正在运行的程序自动最大化?
答:
这是一个例子:
var
hwndwindow:
hwnd;
begin
hwndwindow:
=findwindow(nil,'DELPHI技巧');//DELPHI技艺改成你要最大化的窗口标提.
if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- delphi 编程 经典 源码 总结