Delphi高仿windows记事本源码

合集下载

Delphi工具反编译Delphi

Delphi工具反编译Delphi

Delphi工具反编译Delphi第一节关于反向工程(About Reverse Engineering)反编译?反向?解密?(Decompilation? Reverse? Cracking?)简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。

假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。

耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......真正的反编译可能吗?(Is true decompilation possible?)不,当然不行。

完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。

当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。

名称的丢失意味着反编译器必须为所有的常量、变量、函数和过程创建唯一的名称。

即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。

显而易见,原始编程语言的语法在可执行文件中已不存在。

所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。

为什么要使用并且什么时候使用呢(Why and when to use.)反向工程因为以下几个原因而使用:丢失源码的恢复;把应用程序移入新的硬件平台;判断程序中是否存在病毒或恶意代码;当程序拥有者不能更正错误时的程序错误的更正;其它开发人员的程序源代码的恢复(如:测定一个算法)这合法吗?(Is this legal?)反向工程不是解密,尽管很难在两者之间划一个明晰的界限。

计算机程序被版权和商标法保护。

不同的国家对版权拥有者的权利有着不同的解释。

最共同的解释是,下列情况下的反编译是可以的:为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。

delphi查找文件代码

delphi查找文件代码

在Windows程序设计中WinAPI也为我们提供了类似的函数,它们就是WinExec()和ShellExecute(),下面就来讨论一下这两个函数的用法。

1)WinExec() 函数原型:UINT WinExec(LPCSTR lpCmdLine,UINTuCmdShow);参数说明:(激活的意思是能接受焦点,即标题栏变成蓝色)lpCmdLine:以0结尾的字符串,命令行参数。

uCmdShow:新的应用程序的运行方式。

其取值如下:SW_HIDE 隐藏SW_MAXIMIZE 最大化SW_MINIMIZE 最小化,并把Z order顺序在此窗口之后(即窗口下一层)的窗口激活SW_RESTORE 激活窗口并还原为初始化大小SW_SHOW 以当前大小和状态激活窗口SW_SHOWDEFAULT 以默认方式运行SW_SHOWMAXIMIZED 激活窗口并最大化SW_SHOWMINIMIZED 激活窗口并最小化SW_SHOWMINNOACTIVE 最小化但不改变当前激活的窗口SW_SHOWNA 以当前状态显示窗口但不改变当前激活的窗口SW_SHOWNOACTIVATE 以初始化大小显示窗口但不改变当前激活的窗口SW_SHOWNORMAL 激活并显示窗口,如果是最大(小)化,窗口将会还原。

第一次运行程序时应该使用这个值比如说,我想要用记事本打开"C:\HDC.TXT",以正常方式运行:WinExec("notepad c:\\hdc.txt",SW_SHOWNORMAL);如果调用成功,这个函数会返回一个不小于31的值,否则调用失败,其返回值的意义如下:0 系统内存或资源不足ERROR_BAD_FORMAT .EXE文件格式无效(比如不是32位应用程序)ERROR_FILE_NOT_FOUND 指定的文件设有找到ERROR_PATH_NOT_FOUND 指定的路径没有找到这个函数和system()非常类似,只能运行.EXE文件,这样在WINDOWS中有它不尽人意的地方,比如不能用此方法通过关联的方法打开文件,例如WinExec("1.html",SW_SHOWNA);就不能打开此文档。

如何在Delphi中调用外部程序

如何在Delphi中调用外部程序

如何在Delphi中调用外部程序本实例介绍如何在自己的程序中调用指定的Windows程序。

首先启动一个新的项目,在空白的窗体上添加4个TButton组件。

添加组件后的窗体如图1所示。

图1 添加组件后的窗体其中WinExec按钮用于以WinExec函数来调用指定的Windows程序。

ShellExecute按钮用于以ShellExecute函数来调用指定的Windows程序。

CreateProcess按钮和TerminateProcess按钮用于实现对被调用程序更全面的操作,前者用于调用指定的Windows 程序,而后者则用于终止被调用的Windows程序。

以WinExec函数的方式来调用指定的Windows程序的响应代码如下:其中WinExec函数的第1个参数表示了被调用程序的路径和名称,第2个参数表示了程序的显示方式。

以ShellExecute函数的方式来调用指定的Windows程序的响应代码如下:其中ShellExecute用于打开与指定文件关联在一起的程序文件。

第1个参数用于指定一个窗口的句柄;第2个参数指定了程序运行的类别,如’Open’或’Print’;第3个参数指定了想用关联程序打印或打开的一个程序名或文件名;如果第3个参数中指定了一个可执行文件,那么第4个参数就是传递给执行程序的参数;第5个参数指定了可执行程序的完整路径。

最后一个参数用于设定程序运行方式。

下面来介绍利用CreateProcess函数和TerminateProcess函数如何实现对被调用程序更全面的操作。

首先定义3个全局变量:利用CreateProcess函数调用指定程序的响应代码如下:调用CreateProcess函数激活C:\WINNT\Notepad.exe程序后,把它的进程信息存储在变量PI中,然后通过下面的语句来关闭本实例打开的C:\WINNT\Notepad.exe程序:程序代码如下:保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。

DELPHI编程经典源码总结

DELPHI编程经典源码总结

个人收集资料系列Delphi精典技艺问:如何让del+CTRL+ALT看不见程序运行?答:为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:function RegisterServiceProcess(dwProcessID,dwType:Integer):Integer;stdcall;external'KERNEL32.DLL';再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID,1);//隐藏也可以使用下面的函数:function My_SelfHide:Boolean;typeTRegisterServiceProcess=function(dwProcessID,dwType:DWord):DWORD;stdcall;varhNdl:THandle;RegisterServiceProcess:TRegisterServiceProcess;beginResult:=False;if Win32Platform<>VER_PLATFORM_WIN32_NT then//不是NTbeginhNdl:=LoadLibrary('KERNEL32.DLL');RegisterServiceProcess:=GetProcAddress(hNdl,'RegisterServiceProcess');RegisterServiceProcess(GetCurrentProcessID,1);FreeLibrary(hNdl);Result:=True;endelseExit;end;问:自我拷贝法怎么样使用?答:这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序.打开Delphi,新建一个工程,在窗口的Create事件中写代码:procedure TForm1.FormCreate(Sender:TObject);var myname:string;beginmyname:=ExtractFilename(Application.Exename);//获得文件名if application.Exename<>GetWindir+myname then//如果文件不是在Windows\System\那么..begincopyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{将自己拷贝到Windows\System\下}Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件application.Terminate;//退出end;end;其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径.function GetWinDir:String;varBuf:array[0..MAX_PATH]of char;beginGetSystemDirectory(Buf,MAX_PATH);Result:=Buf;if Result[Length(Result)]<>'\'then Result:=Result+'\';end;问:如何避免同时运行多个相同程序?答:为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序.修改dpr项目文件,修改begin和end之间的代码如下:beginApplication.Initialize;if FindWindow('TForm1','Form1')=0then begin//当没有找到Form1时执行下面代码Application.ShowMainForm:=False;//不显示主窗口Application.CreateForm(TForm1,Form1);Application.Run;end;end.另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。

delphi winexec cmd语句

delphi winexec cmd语句

delphi winexec cmd语句在Delphi中,你可以使用`WinExec`函数来执行命令行语句。

`WinExec`函数允许你在Windows 操作系统上执行外部程序或者命令。

以下是一个简单的示例,演示如何在Delphi中使用`WinExec`来执行cmd命令:```delphiunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)btnRunCmd: TButton;procedure btnRunCmdClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.btnRunCmdClick(Sender: TObject);varCmd: string;begin// 要执行的cmd命令Cmd := 'cmd.exe /c dir C:\'; // 例如,列出C盘根目录下的文件// 使用WinExec执行cmd命令WinExec(PChar(Cmd), SW_SHOWNORMAL);end;end.```在上述示例中,单击按钮时,`btnRunCmdClick`事件处理程序将调用`WinExec`函数执行指定的cmd命令。

请注意,这里使用了`SW_SHOWNORMAL`参数,它指示系统显示新创建的进程的主窗口,并将其激活。

请注意,`WinExec`函数在较新的Windows版本中已被弃用,建议使用更现代的方法,如使用`CreateProcess`函数。

delphi DLL注入完整源码

delphi DLL注入完整源码

DLL注入完整源码1.interface2.es4.Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs,5.StdCtrls, tlhelp32;6.{type7.TProcessEntry32 = record8.dwSize: DWORD; //大小tUsage: DWORD;10.th32ProcessID: DWORD; //线程的pid11.th32DefaultHeapID: DWORD;12.th32ModuleID: DWORD;tThreads: DWORD; //线程数14.th32ParentProcessID: DWORD; //父线程15.pcPriClassBase: integer;16.dwFlags: DWORD;17.szExeFile: array[0..MAX_PATH - 1] of char; //进程名称18.end; } ///说明某个进程TProcessEntry32 结构19.type20.TtoDllFrm = class(TForm)21.Button1: TButton;22.procedure Button1Click(Sender: TObject);23.private24.{ Private declarations }25.public26.{ Public declarations }27.end;28.29.var30.toDllFrm: TtoDllFrm;31.32.implementation33.34.{$R *.DFM}35.36.procedure FindAProcess (const AFilename: string; const PathMatch: Boolean; varProcessID: DWORD); //自定义一个查找a进程的过程,获得pid37.var38.lppe: TProcessEntry32; // 该进程的结构39.SsHandle: Thandle; // 该进程的句柄40.FoundAProc, FoundOK: boolean; //是否找到41.begin42.ProcessID :=0; //初始pid数值43.SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);44.//创建进程快照即进程的瞬时列表表单TH32CS_SnapProcess,0 表示进程列表45.//返回进程列表的句柄46.lppe.dwSize := SizeOf(TProcessEntry32);47.//在调用Process32First API之前,需要初始化lppe记录的大小,48.郁闷测试几个小时,没有初始白忙活近一天,始终找不到错误49.FoundAProc := Process32First(Sshandle, lppe);50.//将进程列表的第一个进程信息读入ppe记录中,并判断是否读入成功.51.52.while FoundAProc do //读入成功,进行下面处理53.begin54.if PathMatch then55.FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 056.// AnsiStricomp 返回2字符串类型的比较结果相同时返回057.else58.FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),PChar(ExtractFilename(AFilename))) = 0;59.//比较获得的参数和返回的ExtractFilename(lppe.szExefile) 值看是否为0.60.if FoundOK then61.begin62.ProcessID := lppe.th32ProcessID;63.break; //找到后,退出循环64.end;65.FoundAProc := Process32Next(SsHandle, lppe);66.///否则继续找直到找到67.end;68.CloseHandle(SsHandle); // 释放句柄69.end;70./71.function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;72.//关于提高线程访问权限的提权并不是什么进程都可以访问73.//访问不了那是权限不够就提权吧74.//这一部分我也没有弄懂,注释以后在++75.var76.hToken: THandle;77.tp: TOKEN_PRIVILEGES;78.a: DWORD;79.const80.SE_DEBUG_NAME = 'SeDebugPrivilege'; //最高权限81.begin82.Result := False;83.if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,hToken))84.//第一参数是要修改访问权限的进程句柄85.//第二个参数指定你要进行的操作类型,要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES86.//第三个参数就是返回的访问令牌指针87.88.89.then90.begin91.tp.PrivilegeCount := 1;92.LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);93.//返回特权名LUID//修改进程的权限,在此处为修改本进程成为具有退出系统的权限94.//第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,95.//第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,96.if bEnabled then97.tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED98.else99.tp.Privileges[0].Attributes := 0;100. a := 0;101.AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);102.//第一个参数是访问令牌的句柄;103.//第二个参数决定是进行权限修改还是除能(Disable)所有权限104.//第三个参数指明要修改的权限105.//第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL106.//第五参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空107.108.Result := GetLastError = ERROR_SUCCESS;109.CloseHandle(hToken);110.end;111.end;112.113.114.function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD =0): DWORD; //自定义注入函数115.var116.hRemoteProcess: THandle; //远程线程句秉117.dwRemoteProcessId: DWORD; //远程线程pid118.cb: DWORD;119.pszLibFileRemote: Pointer; //一个指针指向远程dll的地址120.iReturnCode: Boolean; //返回值作判断用121.TempVar: DWORD;122.pfnStartAddr: TFNThreadStartRoutine; //lib函数地址123.pszLibAFilename: PwideChar; //一个指向文件名124.begin125.Result := 0;126.EnabledDebugPrivilege(True); //提权127.Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);128.//申请内存内存的大小由Length(GuestFile) * 2 + 1 决定129.StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 +1);130.if PID > 0 then131.dwRemoteProcessID := PID132.else133.FindAProcess(HostFile, False, dwRemoteProcessID);134.hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}135.PROCESS_VM_OPERATION + {允许远程VM操作}136.PROCESS_VM_WRITE, {允许远程VM写}137.FALSE, dwRemoteProcessId);138.cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);139.pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));140.//申请内存,并指向内寸地址并付值141.TempVar := 0;142.iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);143.//写入成功,将返回一个不为0-de 值144.if iReturnCode then145.begin146.pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW');147.//GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址148.//GetModuleHandle函数可以返回此句柄149.TempVar := 0;150.Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);151.//新生成的线程分配的线程Id 即TempVar152.end;153.Freemem(pszLibAFilename);154.end;155.156.procedure TtoDllFrm.Button1Click(Sender: TObject);157.begin158.AttachToProcess('Explorer.exe',extractfilepath(paramstr(0))+'Project2.dll');159.//其中Project2.dll是想要注入到Explorer.EXE的进程,Explorer.exe也可以是别的进程.160.end;161.end.。

Delphi常用代码(个人自用整理2)

Delphi常用代码(个人自用整理2)

Delphi常⽤代码(个⼈⾃⽤整理2)3.Delphi 实现⽂件加密源码unit main;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ShellAPI,inifiles,registry,Des ,FileCtrl, jpeg, ExtCtrls;typeTBruce = class(TForm)dlgOpen1: TOpenDialog;Image1: TImage;Button2: TButton;Edit1: TEdit;Label1: TLabel;Button1: TButton;Label2: TLabel;Edit2: TEdit;Button3: TButton;Label3: TLabel;Edit3: TEdit;Button5: TButton;procedure FormCreate(Sender: TObject);procedure Button5Click(Sender: TObject);procedure JiaMI(var FilePath,MiMa:string);procedure JieMi(var DianFile:string);procedure ZhuCeCaiDan;procedure DelZhuCe;procedure Button1Click(Sender: TObject);procedure Edit2Exit(Sender: TObject);procedure FormShow(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varBruce: TBruce;FilePahtName :string;sRoot:WideString;sCaption:string;implementationuses Unit2;{$R *.dfm}DianFile,IniPath:string;inifile: TInifile;beginDianFile:=FilePath+'..\';iniPath:='dat.ini';inifile:=TIniFile.Create(IniPath);inifile.WriteString('111','key',DES.EncryStrHex(MiMa,'FEIGEW')); inifile.Free;renamefile(FilePath,DianFile);end;procedure TBruce.FormCreate(Sender: TObject);vari: Integer;beginZhuCeCaiDan;for i := 1 to ParamCount dobeginif LowerCase(ParamStr(i)) <> '' then beginFilePahtName:= ParamStr(i);end;end;end;procedure TBruce.JieMi(var DianFile:string);varFileName,FileJD:string;i:Integer;beginFileName:=DianFile+'.\';I:=Length(FileName);FileJD:=Copy(FileName,1,i-3);renamefile(FileName,FileJD);end;procedure TBruce.ZhuCeCaiDan;vara:TRegistry;begina:=TRegistry.create;a.rootkey:=HKEY_CLASSES_ROOT;if a.openkey('Folder\Shell\cutbig',true) thena.closekey;end;if a.openkey('Folder\Shell\cutbig\command',true) thenbegin//command⼦键的内容是点击右键后选择相应项后要运⾏的程序;//%1是在单击右键时选中的⽂件名a.writestring('','"'+Application.exeName+'" "%1"');a.closekey;end;a.free;end;procedure TBruce.DelZhuCe;vara:TRegistry;begina:=TRegistry.create;a.rootkey:=HKEY_CLASSES_ROOT;//⽤deletekey删除⼀个主键,其所包含的⼦键也被删除,如果已⽆此主键,运⾏删除操作不会带来别的危害a.deletekey('Folder\Shell\cutbig');a.free;Application.MessageBox('成功删除系统右键菜单!', '成功', MB_OK +MB_ICONINFORMATION);end;procedure TBruce.Button5Click(Sender: TObject);beginapplication.Terminate;end;procedure TBruce.Button1Click(Sender: TObject);varpassword:string;beginif FilePahtName='' then beginApplication.MessageBox('没有可加密的⽂件夹,请从⽂件夹上右键启动加密程序!','系统', MB_OK + MB_ICONWARNING);//Application.Terminate;end;if (Edit1.Text='') or (Edit2.text='') then beginApplication.MessageBox('密码不能为空,请输⼊你的密码!', '系统', MB_OK +MB_ICONWARNING);Exit;end;if Edit2.Text=Edit1.Text then beginpassword:=Edit2.Text;JiaMI(FilePahtName,password);Application.MessageBox('⽂件夹添加密码成功,请牢记您的密码!', '系统', MB_OK+ MB_ICONINFORMATION);//Application.Terminate;end else beginend;end;procedure TBruce.Edit2Exit(Sender: TObject);beginif Edit2.Text<>Edit1.Text then beginApplication.MessageBox('两次输⼊的密码不⼀致,请重新输⼊!', '系统', MB_OK + MB_ICONWARNING);Edit2.SetFocus;end;end;procedure TBruce.FormShow(Sender: TObject);beginEdit1.SetFocus;end;procedure TBruce.Button2Click(Sender: TObject);begin{ FilePahtName:='';if not dlgOpen1.Execute then exit;FilePahtName:=dlgOpen1.FileName;ShowMessage(FilePahtName);}sCaption := '⽂件夹'; //弹出框标题名(⾮弹出框窗体名)sRoot := ''; //初始⽂件夹(如'C:\','D:\DownLoad'等, 不存在则从桌⾯)beginif SelectDirectory(sCaption, sRoot, FilePahtName) then//已返回所选⽂件夹路径给FilePahtName,⾃⾏处理end;ShowMessage(FilePahtName);end;procedure TBruce.Button3Click(Sender: TObject);varlen:Integer;inifile: TInifile;IniPath,password,sstemp:string;beginBruce.JieMi(FilePahtName);len:=Length(FilePahtName);sstemp:=Copy(FilePahtName,1,len-1);iniPath:='dat.ini';inifile:=TIniFile.Create(IniPath);password:=inifile.ReadString('111','key','');password:=des.DecryStrhex(password,'FEIGEW');inifile.Free;Bruce.JiaMI(sstemp,password);if Edit3.Text=password then beginBruce.JieMi(FilePahtName);DeleteFile(IniPath) ;Application.MessageBox('您输⼊的密码错误,请重新输⼊密码!', '系统', MB_OK +MB_ICONWARNING);Edit3.SetFocus;end;end;end.⼀、“软件限时注册”控件(TShareRegist)功能说明:简介:⼀、1、只要将该控件加⼊主窗体,使Action属性设为true,再设置其它属性,你的软件就有限时注册的功能了,只要你牢记三个密钥,并加上给你的算号软件(RegObject_Admin.exe)你就可以⽆敌天下了。

分享一个Delphi制作的文档编辑器源代码(仿Word)

分享一个Delphi制作的文档编辑器源代码(仿Word)

分享⼀个Delphi制作的⽂档编辑器源代码(仿Word)
功能挺多的,就是很多地⽅都没有完善。

不过简单使⽤,是没有问题的。

我也忘记是在哪个⽹站下载的,可能是Git国外的⽹站。

仿Word⽂档编辑器,不过其实没有必要的,因为⽤户会直接使⽤微软或者其他软件来制作⾃⼰的⽂档。

但是却具有参考价值,虽然代码需要优化的地⽅还有很多。

⽐如那些添加控件这些可以去除,把代码结构处理得紧凑⼀些,⽽且增加更多可以⾃定义的地⽅就更理想了。

其实⼤家最最讨厌都是⼀些滚动条和控件背景颜⾊都⽆法⾃定义,都被写得死死的,就像原来Vcl那些玩意⼀样。

想弄个⾃定义界⾯都办不到。

这套代码也是这样,所以需要⼤家⾃⼰改。

下⾯这个是我改的,多页功能,我去掉了,改成单页,跟RichEdit这种类型⼀样。

不过完全⽀持表格、图⽚、GIF图⽚这些添加,⽽且可以⾃定义编辑框背景图⽚的添加和更换。

这样⼀来,也算是解决了⼀直以来的⼼愿。

⾄少收集和管理各种⽂档资料更加⽅便了。

在这⾥提供原来代码的下载地址,原来的忘记了:
有兴趣的,⾃⼰下载看看,⾄于我改的就不提供了。

它⾥⾯带有作者的通讯⽅式,有兴趣可以联系交流。

Delphi直接用WindowsAPI编程讲解

Delphi直接用WindowsAPI编程讲解

Delphi程序员往往习惯了用VCL元件编程,其实Delphi也能进行基于WINDOWS API SDK的编程。

而且用Delphi在某些方面效果似乎比用VisualC++效果还要好。

比如本例程,用Delphi 6编译出来只有9216字节(9k)而同样的Visual C++程序却有16896字节(17k)。

(此例程是笔者从网上下载的c++源码例程,其中有c源程序,和编译好的.exe文件。

源代码经笔者改写成Delphi代码。

)这证明Delphi编译器的优化效果非常好。

API是(Application Programming Interface)的缩写,意为应用编程界面,它包含了编写Windows所有函数、数据类型。

VCL就是以它为基础进行封装的,它是应用程序在Windows 上运行的基础。

通过熟悉使用WINDOWS API SDK直接编制WINDOWS程序,程序员将对WINDOWS的执行机制有更深入的了解,从而编写出更高效、实用的程序。

下面是我们用API函数建立的第一个程序:1 : program HELLOWIN;2 :3 : uses4 : windows, Messages ,mmsystem;5 :6 :7 :8 : var9 : sz_appname:array [0..8] of char='HelloWin'#0;10 : Win_Class: WNDCLASSEX; //窗口类11 : w_Handle,inst:HWND;//w_Handle窗口句柄、程序句柄12 : w_msg:TMSG; //消息数据13 :14 : function WindowProc(h_Wnd,u_Msg,w_Param,l_Param: LONGINT):LRESULT;stdcall;15 : //回调函数16 : var p_hdc:hdc;17 : p_rect:trect;18 : ps : PAINTSTRUCT ;19 : begin20 :21 :22 : case u_msg of23 : WM_DESTROY : PostQuitMessage (0);24 : WM_CREATE : PlaySound (pchar('hellowin.wav'#0), 0, SND_FILENAME or SND_ASYNC) ;25 : WM_PAINT :begin26 : p_hdc := BeginPaint (h_wnd, ps) ;27 : GetClientRect (h_wnd, p_rect);28 : DrawText (p_hdc, pchar('Hello, Windows!'#0), -1, p_rect,29 : DT_SINGLELINE or DT_CENTER or DT_VCENTER) ;30 : EndPaint (h_wnd, ps) ;31 : end;32 :33 : end;34 : Result := DefWindowProc(h_Wnd, u_Msg, w_Param, l_Param);35 : end;36 :37 :38 :39 :40 : begin41 : Inst := hInstance;42 : win_class.cbSize := sizeof (win_class) ;43 : win_class.style := CS_HREDRAW or CS_VREDRAW ;44 : win_class.lpfnWndProc := @WindowProc ;45 : win_class.cbClsExtra := 0 ;46 : win_class.cbWndExtra := 0 ;47 : win_class.hInstance := Inst ;48 : win_class.hIcon := LoadIcon (0, IDI_APPLICATION) ;49 : win_class.hCursor := LoadCursor (0, IDC_ARROW) ;50 : win_class.hbrBackground := HBRUSH (GetStockObject (WHITE_BRUSH)) ;51 : win_class.lpszMenuName := nil ;52 : win_class.lpszClassName := @sz_AppName ;53 : win_class.hIconSm := LoadIcon (0, IDI_APPLICATION) ;54 : RegisterClassEx(Win_Class);55 : w_Handle:=CreateWindow(@sz_appname, pchar('The Hello Program'#0),56 : WS_OVERLAPPEDWINDOW,200,200,300,300,0,0,57 : Inst,nil) ;58 :59 : ShowWindow (w_Handle, SW_SHOWNORMAL) ;60 : UpdateWindow(w_Handle);61 :62 :63 : while(GetMessage(w_msg, 0, 0, 0)) do64 : begin65 : TranslateMessage(w_msg);66 : DispatchMessage(w_msg);67 : end;68 :69 :70 : end.以上源程序读者可以直接拷贝到记事本中,把行标去掉后另存为.dpr文件,然后用Delphi直接打开,就可以编译运行,之后你就会听到电脑向你发出的问候。

delphi结束进程代码

delphi结束进程代码
terminateprocess(jinchengjubing,0); //关闭进程句柄
result := pid; //该函数返回值
end;
closehandle(jubing); //释放进程快照的句柄归还系统资源
end;
exports
zhaodaojincheng;
zhenjia : Boolean; //返回一个布尔值
processid : longword;//储存进程ID
mingcheng : String;//储存进程名称
pid : longword;//用来储存进程id
jinchengjubing : longword; //用来储存进程句柄
呵呵 貌似TerminateProcess结束不了系统保护的进程,我也不知道什么原因,可能是权限不够还是什么的吧,反正我写了个结束进程的小程序去结束QQ.exe和结束记事本的进程可以正常结束,但是结束360rp.exe却无法结束掉了。以下是我的代码:
dll部分:
uses
ShareMem,SysUtils,TLHelp32,windows,
begin
jubing := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获得进程快照句柄
fprocessentry32.dwSize := sizeof(fprocessentry32); //给TProcessEntry32结构的第一个参数赋值(也可以理解为把这个结构的第一个参数初始化)
var
shuru : string;//给自定义函数输入参数用的变量
fanhuizhi : longword;

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序

一、Windows服务简介服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service Application)中可能包含若干个服务(Service),每个服务就是其中的一个线程(该服务也可以创建多个子线程)。

采用服务,应用程序可以获得特殊的权限,而且不会被用户通过Win2000的任务管理器直接结束程序,所以服务常常用来实现一些特殊的目标。

通过Win2000控制面板中的服务管理工具,我们可以设置/查看服务的特性:(1)服务名称;(2)显示名称;(3)描述;(4)启动类型;(5)依赖关系;其中,服务名称是标识给服务的。

以Win2000的C:\WINNT\System32\程序为例子,该Exe文件对应一个Service Application,是该服务程序的可见实体;该exe中包含多个服务(Service),例如Alerter,Dhcp(DHCP Client),Messenger等。

当我们结束一个服务的时候,该服务所在的Service Application 中的其他服务并没有被终止。

在Delphi中,Borland的工程师为我们提供了TServiceApplication,TService,TServiceThread等类,封装了大量细节,简化了服务程序的。

二、TServiceApplication在Delphi中,类TServiceApplication就对应上述的ServiceApplication。

利用Delphi的开发环境,我们新建一个Service Application Project,同时就创建了一个继承自TService的类。

项目文件中的Application对象就是一个TServiceApplication实例。

每个TServiceApplication包含若干个TService对象,正好对应上述的服务程序和服务之间的数量关系。

delphi 修改源码 编译

delphi 修改源码 编译

delphi 修改源码编译Delphi是一种用于开发Windows应用程序的编程语言,它具有易学易用、高效稳定的特点。

在开发过程中,我们经常需要修改源码并重新编译程序,以满足特定的需求或修复bug。

本文将介绍如何使用Delphi修改源码并编译程序的步骤和注意事项。

我们需要打开Delphi集成开发环境(IDE)。

在IDE中,我们可以找到源码文件,这些文件通常以.pas作为扩展名。

源码文件包含了程序的逻辑代码,我们可以在这里进行修改。

在打开源码文件之前,我们需要确保已经安装了Delphi的开发环境,并且具备对源码文件的读写权限。

如果没有安装Delphi,可以从官方网站上下载并安装最新版本的Delphi开发环境。

一旦我们打开了源码文件,就可以开始进行修改。

根据需求,我们可以添加新的功能、修改现有功能或修复bug。

在修改之前,我们应该仔细阅读源码,了解程序的结构和逻辑。

在修改源码时,我们应该遵循一些编码规范。

例如,我们可以使用有意义的变量名和函数名,以增加代码的可读性。

此外,我们应该注释代码,解释每个函数或过程的作用和用法。

这样,其他开发人员在阅读我们的代码时就能更容易理解。

完成源码的修改后,我们需要重新编译程序。

在Delphi IDE中,我们可以点击“编译”按钮或通过菜单栏中的选项来进行编译。

编译过程将检查代码的语法和错误,并生成可执行文件。

在编译过程中,我们应该注意编译器的输出信息。

如果有错误或警告信息,我们应该及时修复。

有时,修改源码可能会导致其他部分的代码出现问题,这就需要我们仔细检查和调试程序。

一旦编译成功,我们就可以运行程序并测试修改的功能。

在测试过程中,我们应该尽可能地覆盖各种场景和输入,以确保程序的稳定性和正确性。

如果测试通过,我们可以将修改后的程序部署到生产环境中。

在部署之前,我们应该先备份原始程序,以防止意外情况发生。

然后,我们可以将新的可执行文件复制到目标系统,并进行必要的配置和测试。

delphi7.0的经典实例5

delphi7.0的经典实例5

作为资源文件嵌入就可以解决这个问题。

用记事本写一个exe.rc,里面就一句;MYEXE EXEFILE ssl.exe然后用brcc32编译exe.rc,生成exe.res文件在你的单元中插入{$R exe.res}至于提取出来也很简单procedure TForm1.ExtractFile;varresStream:TResourceStream;begintryresStream:=TResourceStream.Create(hinstance,PChar( 'MYEXE '),PChar( 'EXEFILE '));resStream.SaveToFile( 'c:\e.exe ');resStream.Free;........exceptShowMessage( '提取文件错误');end;end;把Delphi程序嵌入到其他程序中把Delphi程序嵌入到其他程序中作者:佚名文章来源:网络点击数:193 更新时间:2011-4-29 16:13:15怎样把Delphi程序嵌入到其他程序中?2007-02-21 15:17某个bbs站上有文章:(想来作者不会介意我装载吧!)============================================================================== 文件合并器的制作方法作者:王昊从想到做文件合并器到现在已经有一个多月了,但是一直没有静下心来想它的实现方法. 昨天看数学看烦了, 我终于忍不住扔开了书,开始着手"文件合并器"的编制.3小时后,终于有了眉目,今天又改了一下.现在终于能够和各位分享我的喜悦了.我愿意将我的方法写给大家,也希望各位高手不吝赐教.先看看我们的目的:编写一个程序A,它能够将两个可执行程序B和C合并在一起,形成一个新的可执行程序D. 要让用户执行D的时候,相当于同时运行B和C两个程序.我的开发工具:我现在能够用VB和DELPHI中的任何一个开发这个软件.这次我用的是DELPHI.如果你需要,也可以用VC或BCB来完成.下面我用这三个小时中我考虑的东西为线索来讲讲主要的原理.一. 我的疑惑.将两个可以执行的程序合并在一起会变成什么东西?这是我的第一个疑惑.要解决这个问题,首先要学会如何将两个文件合并在一起.我想到了内存流(MemoryStream),它能极方便的完成这个步骤.假设有两个可执行文件f1, f2.现在要把他们合并在一起.下面给出原代码.varstrmSource,strmDest:TMemoryStream;begin//先读f1strmSource:=TMemoryStream.Create;strmSource.loadfromfile(f1);//拷贝到strmdeststrmDest:=TMemoryStream.Create;strmDest.copyfrom(strmSource,strmSource.size);strmSource.clear;//再读f1strmSource.loadfromfile(f2);//拷贝到strmdeststrmDest.seek(strmDest.size,soFromBeginning);strmDest.copyfrom(strmSource,strmSource.size);strmSource.free;//这时strmDest里面便是两个文件合并后的内容了.将它保存为文件strmDest.SaveToFile('dest.exe');strmDest.free;end;我惊讶的发现,执行dest.exe就相当于执行f1!!为了确认,我将原代码中f1和f2的1的后面添加很多无意义的字节,得到的新的f1运行竟然很正常.现在我们知道了,将两个或者多个可执行文件合并在一起,得到的新文件执行时只是执行第一个文件.这是非常关键的一步.二.如何分离?合并没有问题了,如何分离呢?在知道原来的两个文件的大小的情况下,这很容易作到.假设i1和i2是原来两个文件的大小(字节).合并后的文件是"dest.exe".varstrmSource,strmDest:TMemoryStream;Begin//先读dest.exestrmSource:=TMemoryStream.Create;strmSource.loadfromfile('dest.exe');//拷贝f1到strmdeststrmDest:=TMemoryStream.Create;strmDest.copyfrom(strmSource,i1);//保存f1strmDest.SaveToFile(f1);strmDest.clear;//拷贝f2到strmdeststrmSource.seek(i1,soFromBeginning);strmDest.copyfrom(strmSource,i2);strmDest.SaveToFile(f2);strmDest.free;strmSource.free;end;三.总体思路.在解决了上述问题后,我的总体思路就出来了.假设我给用户的程序是A,它能把一个可执行的程序,我把它叫做标准程序S,他能将D的第二部分和第三部分(就是原来的可执行文件B和C)读出来,保存在磁盘上,然后执行他们.但大家看了"如何分离"后应该知道,只有我们知道了B和C的长度时,才能方便的从D中读出他们.而为了使D可以在另一个用户的机子上也能够运行,我认为B和C的长度信息应该保存在D的最后.于是,D应该具有四个部分:1: S2: B3: C4: 长度信息那么,既然我给用户的程序是A,那么这里的标准程序又从何而来呢?标准程序又应该保存在哪里呢?有两个办法.第一,给用户的程序包含两个文件,一个是A,一个是S.但我觉得这样不够爽.于是我用了另一个方法: 将S连在A的后面,成为A'.于是乎,当用户执行A'时,A'要求用户选择两个可执行文件B和C.当用户点击确定时,A'将它自身所带的S与B和C合并起来,形成D.然后,用户便可以执行D了,这时的D并不依赖于A'.D执行时,实际上执行的是它的第一部分S,S首先从D的最后取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目录.然后调用ShellExecute执行他们.这样就达到了我们的目的.那么,长度信息如何定义呢?如何将S连在A的后面呢?S如何完成自身的功能呢?这就是我下面要讲的.四.保存长度信息.我先讲一讲如何把一个字符串写入内存流.其实我自己也不知道如何直接将一个字符串的内容读到内存流中,于是我采取了先将字符串内容写入一个临时文件中,然后用loadformfile将文件内容读入内存流中.然而,我们必须知道连接在D后面的长度信息的具体长度,也就是说用几个字节保存,才能让S读出长度信息.我考虑再三,决定用32个字节来表示每个文件的长度,虽然大多数情况下,文件大小不会超出100M.看看这里的代码:varstrmSource,strmDest:TMemoryStream;f:TextFile;begin//先用上面的方法将S和B与C的内容写入strmdest,现在要在strmDest里面添加长度信息//假设s1,s2里放有B和C的大小,先把他们变为32个字节.while length(s1)<32 dobegins1:='0'+s1;end;while length(s2)<32 dobegins2:='0'+s1;end;//s1存入文件assignfile(f,'tmp');rewrite(f);trywrite(f,s1);finallyclosefile(f);end;//文件内容读入strmSourcestrmSource:=TMemoryStream.Create;strmSource.loadfromfile('tmp');//加到strmDest后面strmDest.copyfrom(strmSource,strmSource.size);strmSource.clear;deletefile('tmp');//s2存入文件assignfile(f,'tmp');trywrite(f,s2);finallyclosefile(f);end;//文件内容读入strmSourcestrmSource:=TMemoryStream.Create;strmSource.loadfromfile('tmp');//加到strmDest后面strmDest.copyfrom(strmSource,strmSource.size);strmSource.free;deletefile('tmp');end;利用代码里的方法,便可将长度信息保存在D的最后了.五.标准文件.现在我想大家感到疑惑的就是标准文件S了,这到底是个什么玩意儿?怎么做它?其实,我们在前面已经讲过了,"S首先从D的最后取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目录. 然后调用ShellExecute执行他们".要注意这里的S和D是在一起的,S只不过是D的第一部分.他们的文件名是一样的了.于是就变成了S的功能是从它自身的后面取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目录.然后调用ShellExecute执行他们.我想,具体的方法我前面已经讲的很清楚了.只要记住长度信息是分别用32个字节表示的就行了.六.完整步骤先编写S,然后编写A.再写一个程序E将S和A连接起来,S放在A的后面,成为A'.将A'发布给用户.七.注意事项.器.因此,我在这里要警告这部分人:制作或散发病毒是违反法律的,将受到法律允许范围内的最高处罚.请好自为之。

Delphi实用教程(第2版)[郑阿奇主编][电子教案]

Delphi实用教程(第2版)[郑阿奇主编][电子教案]

图5.6 Frame窗体内组件的布局
图5.7 设置组件模板属性
5.2 VCL Form多窗体
(3)选择主菜单的FileSave命令项,保存这个Frame窗体的单元文件,注意 保存该单元文件时要使用自定义的文件名(如Test),而不要使用默认的单元文件名 Unit1,因为这样会在以后的使用中与Form窗体的单元文件名发生冲突。 (4)将所创建的Frame对象加入到组件选项页中。在Frame2窗体区域,在弹出 菜单的快捷菜单中选择Add To Palette菜单命令,就会弹出如图5.7所示的对话框,在 该对话框的Component name编辑框中填入组件名,然后在下拉列表中选择希望加入 的组件选项页,最后可用Change…按钮选择一个合适的组件模板图标。本例将组件 模板命名为test,添加到Templates选项页,并选择了如图5.7所示的图标。按“OK” 按钮,这个Frame对象就被添加到组件选项页中了,见图5.8。
5.2 VCL Form多窗体
5.2.1窗体的创建 新建一个项目时,项目中已包含了一个名为Form1的窗体。若要向项目中加入 新的窗体,有两种方法,一是执行FileNewForm-Delphi For Win32菜单命令, 项目中会增加一个名为Form2的新窗体,按此方法,可以为程序加入多个窗体;另 外一种方法是使用窗体模板,Delphi 的设计思想是代码重用性,所以系统提供了一 些用户可重复应用的窗体模板。使用窗体模板,可以快速地生成多种对话框窗体, 节省了大量的重复工作。例如要为项目增加一个About对话框窗体,可以选择 FileOther菜单命令,在Delphi Projects的Delphi Files中选择About Box对话框,项 目中会增加一个About窗体(图5.1)。

用DELPHI编写WINDOWS服务程序

用DELPHI编写WINDOWS服务程序

会把所有的请求委托给该 TServiceThread 成员对象处理,该对象以默认的方式处理所有的请求。 TService. ServiceExecute 是 TService 的主体内容。一个服务要正常运行,除了需要处理它要关注的目标(比如监听某个端口、执行某个 任务等)外,还要响应外部命令/请求:比如终止、暂停、恢复该服务。因此可以考虑创建一个专门的线程来完成该任务,而在 ServiceExecute 中处理外面命令/请求inated do begin ServiceThread.ProcessRequests(False); end; 当然,也可以在 OnExecute 中处理某些任务,如监听某个端口,但是这常常会导致该 Service 不能及时响应 Stop/Pause 等请求。当 OnExecute 执行完了,该服务实际上就完成了任务要结束了(terminate)。
MyPHSThread := TPHSSendThread.Create(); MyPHSThread.FreeOnTerminate:=True;
MyPHSThread.Priority:= tpLower ;
end;
在 OnStop 事件内,我们应该停止线程,并释放打开的资源,需要注意的是当你停止线程时,一般用 Terminate 方法,在线程内用 Terminated 属性来判断 是否需要结束线程,而由于是线程,和主进程是时间运行的,有可能你刚好在进行 Terminate 时,线程已经刚进行过 Terminated 判断,正在进行比较费时 的处理工作,而此时主进程立即执行 Terminate 后就进行释放资源的工作时,会造成线程执行错误,因此应该等到线程真正的正确停止后,主进程才能进行资 源释放工作。
三、TService

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序Delphi是一种基于Object Pascal语言的集成开发环境(IDE),主要用于Windows平台的软件开发。

它提供了丰富的库和组件,使得开发者可以轻松地创建各种类型的应用程序,包括Windows服务程序。

Windows服务程序是在后台运行的应用程序,它们可以在Windows系统启动时自动启动,并在系统运行期间持续运行。

这些服务通常用于执行一些重要的任务,如数据备份、定时任务、网络通信等。

编写Windows服务程序需要以下步骤:1. 创建新的Delphi项目:打开Delphi IDE,选择"File"菜单,点击"New",然后选择"Other",在弹出的对话框中选择"Service Application",点击"OK"按钮。

这将创建一个新的Windows服务程序项目。

2. 设计服务:在Delphi IDE的主界面中,可以看到Service1单元。

在该单元中,可以定义服务的属性和事件。

可以使用TService组件来添加自定义的属性和事件。

例如,可以添加一个Timer组件来定时执行某个任务。

3. 编写服务逻辑:在Service1单元中,可以编写服务的逻辑代码。

例如,可以在服务的OnStart事件中编写启动逻辑,在OnStop事件中编写停止逻辑。

可以使用Delphi提供的各种库和组件来实现所需的功能。

4. 安装服务:在Delphi IDE的主界面中,选择"Project"菜单,点击"Options",然后选择"Application"选项卡。

在"Title"字段中输入服务的名称,在"Description"字段中输入服务的描述。

然后点击"Install"按钮,将服务安装到系统中。

delphi11.3中linuxpaserver源代码

delphi11.3中linuxpaserver源代码

delphi11.3中linuxpaserver源代码Delphi 11.3 LinuxPaserver源代码是一款在Linux平台上运行的软件开发工具。

它提供了一种有效的方法,开发人员可以在Linux系统上编写和调试Delphi程序,这为世界上最受欢迎的开发工具之一增添了新的功能和可移植性。

在本文中,我们将逐步回答关于Delphi 11.3 LinuxPaserver源代码的一些重要问题,以帮助读者更好地了解该工具的性能和功能。

第一步:什么是Delphi 11.3 LinuxPaserver源代码?Delphi 11.3 LinuxPaserver源代码是一种用于在Linux平台上开发和调试Delphi程序的开发工具。

它由Embarcadero Technologies开发,并在Delphi集成开发环境(IDE)中提供。

通过将Delphi代码编译为Linux 下的可执行代码,开发人员可以在Linux系统中运行和测试他们的应用程序,以确保其在不同平台上的兼容性和稳定性。

第二步:Delphi 11.3 LinuxPaserver源代码有哪些主要功能?Delphi 11.3 LinuxPaserver源代码提供了一套强大的功能,使开发人员能够在Linux系统上进行高效的编码和调试。

以下是它的主要功能:1. 支持多种Linux发行版:Delphi 11.3 LinuxPaserver源代码可以在多种流行的Linux发行版上运行,包括Ubuntu、CentOS和Red Hat Enterprise Linux等。

这使得开发人员能够根据自己的喜好和需求选择合适的操作系统进行开发。

2. 代码编辑和调试:该工具提供了一个强大的代码编辑器,具有代码自动完成、语法高亮和错误检查等功能,可以显著提高开发效率。

它还提供了强大的调试功能,允许开发人员在Linux系统上单步执行和跟踪他们的代码,以查找和解决错误。

3. GUI设计:Delphi 11.3 LinuxPaserver源代码支持图形用户界面(GUI)设计,开发人员可以轻松创建各种窗体、按钮、菜单等元素,并通过可视化工具进行布局和设计。

记事本程序源代码汇总

记事本程序源代码汇总

记事本程序源代码汇总下面是一个简单的记事本程序的源代码:```#include <iostream>#include <fstream>#include <string>using namespace std;void showMencout << "**********************" << endl; cout << " 记事本程序 " << endl; cout << "**********************" << endl; cout << "请选择以下操作:" << endl;cout << "1. 新建记事本文件" << endl;cout << "2. 打开已有记事本文件" << endl; cout << "3. 查看记事本文件内容" << endl; cout << "4. 添加文本到记事本文件" << endl; cout << "5. 退出程序" << endl;cout << "**********************" << endl; void createFilstring filename;cout << "请输入新建记事本文件的文件名:";cin >> filename;//在当前目录创建一个新文件ofstream outFile(filename);outFile.close(;cout << "成功创建记事本文件:" << filename << endl; void openFilstring filename;cout << "请输入要打开的记事本文件的文件名:";cin >> filename;//尝试打开已存在的文件ifstream inFile(filename);if (!inFile)cout << "无法打开文件:" << filename << endl;} elsestring content;getline(inFile, content, '\0');cout << "记事本文件内容:" << endl;cout << content << endl;inFile.close(;}void viewFilstring filename;cout << "请输入要查看的记事本文件的文件名:"; cin >> filename;//尝试打开已存在的文件ifstream inFile(filename);if (!inFile)cout << "无法打开文件:" << filename << endl; } elsestring line;cout << "记事本文件内容:" << endl;while (getline(inFile, line))cout << line << endl;}inFile.close(;}void appendToFilstring filename;cout << "请输入要添加文本的记事本文件的文件名:";cin >> filename;//尝试打开已存在的文件ofstream outFile(filename, ios::app);if (!outFile)cout << "无法打开文件:" << filename << endl;} elsestring content;cout << "请输入要添加的文本内容(以#结束):" << endl; while (true)getline(cin, content);if (content == "#")break;}outFile << content << endl;}outFile.close(;cout << "成功添加文本到记事本文件:" << filename << endl; }int maiint choice;doshowMenu(;cout << "请输入您的选择:";cin >> choice;switch (choice)case 1:createFile(;break;case 2:openFile(;break;case 3:viewFile(;break;case 4:appendToFile(;break;case 5:cout << "感谢使用记事本程序,再见!" << endl;break;default:cout << "无效的选择,请重新输入!" << endl;}} while (choice != 5);return 0;```这个记事本程序通过命令行界面提供了以下操作:1.新建记事本文件:用户输入一个文件名后,在当前目录下创建一个新文件作为记事本。

Delphi面向Windows开发的基本实现

Delphi面向Windows开发的基本实现

第5章 面向Windows开发的基本实现Delphi可以实现Windows系统中的大多数可执行文件类型,这主要包括可执行程序(.EXE)和动态链接库(.DLL)。

其他的一些文件类型,通常以动态链接库的形式编译,只是输出的文件扩展名不同而已(例如.CPL,.SCR,.OCX等)。

Delphi使用动态链接库的格式实现了自己的库文件:包(.BPL)。

本章全面解析Delphi支持这些文件格式的每一个细节。

5.1 Win32应用程序:EXE5.1.1 适应Win32应用程序的最简化内核Nico Bendlin的MiniDExe很好地演示了不使用任何Delphi例程来实现一个Win32应用程序的方法。

对于一个可执行程序.EXE来说,只须满足如下条件,就可以在被Windows系统中执行:是一个以.EXE方式生成的格式正确的PE (Portable Executable)文件有一个正确的入口地址并记录在PE格式文件的头部编译器会按这样的规则生成文件模块,并将一段入口代码的地址记录在PE格式文件的头部。

这段入口代码固定地调用System.pas中的例程_InitExe()。

因此,可以进一步简化Nico Bendlin的MiniDExe://系统初始化单元unit SysInit;interfaceDelphi源代码分析第5章面向Windows开发的基本实现·84·varTlsIndex: Integer = -1;TlsLast: Byte;constPtrToNil: Pointer = nil;implementationend.//系统内核单元unit System;interfaceprocedure _InitExe;procedure _HandleFinally;procedure _Halt0;constKernel32 = 'kernel32.dll';User32 = 'user32.dll';typeTGUID = recordD1: LongWord;D2: Word;D3: Word;D4: array[0..7] of Byte;end;implementationprocedure ExitProcess (uExitCode: LongWord); stdcall; external kernel32 name 'ExitProcess';procedure _InitExe;asmend;procedure _HandleFinally;asmend;Delphi源代码分析5.1 Win32应用程序:EXE ·85·procedure _Halt0;beginExitProcess(0);end;end.//示例程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主要功能都已添加上并测试可用。

效果图:源码:unit Unit1Calculator;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ComCtrls;typeTForm1 = class(TForm)ColorDialog1: TColorDialog;SaveDialog1: TSaveDialog;ColorDialog2: TColorDialog;MainMenu1: TMainMenu;N1: TMenuItem;myNew: TMenuItem;mySave: TMenuItem;N3: TMenuItem;myPage: TMenuItem;myPrint: TMenuItem;myQuit: TMenuItem;myEdit: TMenuItem;myUndo: TMenuItem;N4: TMenuItem;myCut: TMenuItem;myCopy: TMenuItem;myPaste: TMenuItem;myDelete: TMenuItem;N6: TMenuItem;myFind: TMenuItem;myReplace: TMenuItem;myFormat: TMenuItem;myFont: TMenuItem;myView: TMenuItem;myStatus: TMenuItem;myHelp: TMenuItem;myHelpTopics: TMenuItem;N9: TMenuItem;myAbout: TMenuItem;OpenDialog1: TOpenDialog;FontDialog1: TFontDialog;myOpen: TMenuItem;FindDialog1: TFindDialog;ReplaceDialog1: TReplaceDialog;FontDialog2: TFontDialog;PageSetupDialog1: TPageSetupDialog;PrintDialog1: TPrintDialog;RichEdit1: TRichEdit;procedure myNewClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure myOpenClick(Sender: TObject);procedure mySaveClick(Sender: TObject);procedure myQuitClick(Sender: TObject);procedure myUndoClick(Sender: TObject);procedure myCutClick(Sender: TObject);procedure myCopyClick(Sender: TObject);procedure myPasteClick(Sender: TObject);procedure myDeleteClick(Sender: TObject);procedure myFindClick(Sender: TObject);procedure myReplaceClick(Sender: TObject);procedure myFontClick(Sender: TObject);procedure myPageClick(Sender: TObject);procedure myPrintClick(Sender: TObject);procedure myAboutClick(Sender: TObject);procedure myHelpTopicsClick(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction); private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}var fName: String;procedure TForm1.myNewClick(Sender: TObject);var msg : integer;beginif (richEdit1.Modified) thenbeginmsg := Application.MessageBox('文件已被修改,是否保存?', 'Delphi记事本', mb_YesNoCancel);case msg ofidYes: beginmySaveClick(Sender);richEdit1.Clear;fName := '文档1';Caption := fName + '--Delphi记事本';end;idNo: beginrichEdit1.Clear;fName := '文档1';Caption := fName + '--Delphi记事本';end;idCancel: ;end;endelse beginrichEdit1.Clear;fName := '文档1';Caption := fName + '--Delphi记事本';end;end;procedure TForm1.FormCreate(Sender: TObject);beginfName := '文档1';richEdit1.Clear;Caption := fName + '--Delphi记事本';end;procedure TForm1.myOpenClick(Sender: TObject);var msg : integer;beginif (richEdit1.Modified) thenbeginmsg := Application.MessageBox('文件已被修改,是否保存?', 'Delphi记事本', mb_YesNoCancel);case msg ofidYes: beginmySaveClick(Sender);end;idNo: if (openDialog1.Execute) thenbeginfName := openDialog1.FileName;richEdit1.Lines.LoadFromFile(fName);form1.Caption := fName + 'Delphi记事本';end;idCancel: ;end;endelse if (openDialog1.Execute) thenbeginfName := openDialog1.FileName;richEdit1.Lines.LoadFromFile(fName);form1.Caption := fName + 'Delphi记事本';end;end;procedure TForm1.mySaveClick(Sender: TObject);beginif (fName <> '文档1') thenbeginrichEdit1.Lines.SaveToFile(fName);endelse beginsaveDialog1.FileName := fName;if (saveDialog1.Execute) thenbeginfName := saveDialog1.FileName;richEdit1.Lines.SaveToFile(fName);form1.Caption := fName;end;end;richEdit1.Modified := false;end;procedure TForm1.myQuitClick(Sender: TObject);beginif (richEdit1.Modified) then mySaveClick(Sender); Application.Terminate;end;procedure TForm1.myUndoClick(Sender: TObject);beginrichEdit1.Undo;end;procedure TForm1.myCutClick(Sender: TObject);beginrichEdit1.CutToClipboard;end;procedure TForm1.myCopyClick(Sender: TObject);beginrichEdit1.CopyToClipboard;end;procedure TForm1.myPasteClick(Sender: TObject);beginrichEdit1.PasteFromClipboard;end;procedure TForm1.myDeleteClick(Sender: TObject);beginrichEdit1.ClearSelection;end;procedure TForm1.myFindClick(Sender: TObject);beginfindDialog1.Execute;end;procedure TForm1.myReplaceClick(Sender: TObject);beginreplaceDialog1.Execute;end;procedure TForm1.myFontClick(Sender: TObject);beginfontDialog1.Font := richEdit1.Font; //初始化字体对话框if (fontDialog1.Execute) then richEdit1.SelAttributes.Assign(fontDialog1.Font); end;procedure TForm1.myPageClick(Sender: TObject);beginpageSetupDialog1.Execute;end;procedure TForm1.myPrintClick(Sender: TObject);beginif (printDialog1.Execute) thenbeginrichEdit1.Print(fName);end;end;procedure TForm1.myAboutClick(Sender: TObject);beginShowMessage('Delphi记事本1.0' + #13 + ' 记念于12.5.14');end;procedure TForm1.myHelpTopicsClick(Sender: TObject);beginmyAboutClick(Sender);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); beginmyQuitClick(Sender);end;end.。

相关文档
最新文档