极点时间自动校准器 不指定

青色咖啡 , 2010/10/03 15:23 , 个人作品 , 评论(1) , 阅读(1000) , Via 本站原创

我的电脑电池没电了,每天开机都要调时间,很烦,我从我开发的另外一款软件里面把这个软件分离出来了,放给大家使用

功能很简单,就是效时,每次开机会自动启动 ,360安全卫士或杀毒软件提示有开机启动程序请允许。软件压缩后仅64K,很小的

文件类型 : PE32 executable for MS Windows (console) Intel 80386 32-bit
MD5 : 4bbe2fb633307fb5815d669c123ec9f7
SHA1 : 7efca6db1d195791d9a7046598fd49af79246a71

杀毒软件扫描结果看这里:

http://www.virscan.org/report/01f521722275320be19c312b71ba9019.html

下载文件 (已下载 333 次)

最新消息,不知道是没交"保护费"还是什么原因,导致国内可牛杀毒和360安全卫士把本人开发的程序报木马,本人在此声明,本程序是一款正常程序,不是以上杀毒软件标榜的木马,清者自清。下不下载由你来选择。

删不掉的桌面快捷方式 不指定

青色咖啡 , 2010/09/26 17:29 , 电脑技巧 , 评论(0) , 阅读(409) , Via 本站原创
最近接到了一个比较奇怪的案例:桌面上有恶意软件的广告,但是删除不了,也不能重命名。在IceSword和其它工具中找不到它的存在。显然问题出在了Explorer上。正好我的桌面上也有一个请不走的蓝牙链接。如左图:
用FixIE这个工具清理掉它,发现其实秘密就在注册表HKEY_CURRENT_USER或者HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorerDesktopNamespace项下,这个项顾名思义就是Explorer的一些配置。
Explorer提供一种名叫“Namespace”的配置,可以在桌面上添加快捷方式。这种快捷方式就像上面提到的那样,删除不掉而且在注册表中又很难直接搜索到(回收站就是这么来的)。如果我们想添加一个,具体怎么做呢?青色咖啡在这里说一下:
首先,我们需要一个CLSID。听说过COM组件的同学们可能知道,它是一个128位的大数,意在概率意义上标识“唯一”的COM组件。CLSID完全可以手写一个,只要不与已知的重名就可以了。然后编写一个COM组件。实际上现在没有必要去写一个真正的COM组件。我们只需要在注册表上做手脚罢了。
 
1.注册一个假的CLSID。
现在点击“开始”,“运行”,输入“regedit.exe”确定。打开注册表HKEY_LOCAL_MACHINESOFTWAREClassesCLSID 后,新建一个项。项名为随便写的一个128位CLSID,格式和其他CLSID尽量保持一致,内容可以瞎编。只要不和已知的重复就可以了。例如我的这个就基本写了一堆0。然后在右边的“默认”键中填写我们需要显示的文字(比方我们要做打开任务管理器的快捷方式):
在这个CLSID下再新建一个子项,项名为Shell,再在Shell下面再创建一个子项,项名为菜单的名称,再在这个项下面键一个名为Command的子项,然后将右边的“默认”一键的键值设为taskmgr.exe。
如左图:
然后进行最关键的一步操作(之一)!在我们编的那个CLSID项下建立一个名为ShellFolder的项,并在它下建立一个名为Attributes的二进制键,键值为00 00 00 00。这一步的重要性是——有了它之后,右击图标后“删除”选项就没了~~~
如果觉得想搞个图标,就在我们的CLSID项建立一个名为DefaultIcon的项,在右边的“默认”键中填入想要的图标的路径就可以了。(可以使用shell32.dll中的图标,如下图)
Shell32.dll,130是一个蝴蝶的图标,看不起不错。到这里,我们伪造的CLSID就完成了。之所以说伪造,因为我们没有实际的COM组件,甚至连InprocServer32项也没有,很好很山寨。
 
2.设置桌面快捷方式
现在进入项:
HKEY_CURRENT_USER或者HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorerDesktopNamespace
新建一个项,项名就是我们的CLSID值。保存后刷新桌面。看看效果还不错吧?
 

知道怎么制作的就知道怎么删除了吧,呵呵..

Hook API 不指定

青色咖啡 , 2010/09/21 16:41 , 个人作品 , 评论(0) , 阅读(341) , Via 本站原创
我们今天要拦截的API如下: MessageBoxA、MessageBoxW、MessageBeep 和 OpenProcess 。 首先,大家都知道要在整个系统范围中拦截,需要使用Dll来完成。现在我们打开Delphi 2009,新建一个Dll工程:hookDll。需要说明的是,Delphi是完全面向对象的编程语言,所以我们不要浪费,这个Dll打算用类的方式完成。于是,在新建的DLL工程中在添加一个Unit Pas,命名为unitHook, 用来写拦截类的处理。unitHook.pas中的代码如下: unit unitHook; interface uses Windows, Messages, Classes, SysUtils; type //NtHook类相关类型 TNtJmpCode=packed record //8字节 MovEax:Byte; Addr:DWORD; JmpCode:Word; dwReserved:Byte; end; TNtHookClass=class(TObject) private hProcess:THandle; NewAddr:TNtJmpCode; OldAddr:array[0..7] of Byte; ReadOK:Boolean; public BaseAddr:Pointer; constructor Create(DllName,FuncName:string;NewFunc:Pointer); destructor Destroy; override; procedure Hook; procedure UnHook; end; implementation //================================================== //NtHOOK 类开始 //================================================== constructor TNtHookClass.Create(DllName: string; FuncName: string;NewFunc:Pointer); var DllModule:HMODULE; dwReserved:DWORD; begin //获取模块句柄 DllModule:=GetModuleHandle(PChar(DllName)); //如果得不到说明未被加载 if DllModule=0 then DllModule:=LoadLibrary(PChar(DllName)); //得到模块入口地址(基址) BaseAddr:=Pointer(GetProcAddress(DllModule,PChar(FuncName))); //获取当前进程句柄 hProcess:=GetCurrentProcess; //指向新地址的指针 NewAddr.MovEax:=$B8; NewAddr.Addr:=DWORD(NewFunc); NewAddr.JmpCode:=$E0FF; //保存原始地址 ReadOK:=ReadProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved); //开始拦截 Hook; end; //释放对象 destructor TNtHookClass.Destroy; begin UnHook; CloseHandle(hProcess); inherited; end; //开始拦截 procedure TNtHookClass.Hook; var dwReserved:DWORD; begin if (ReadOK=False) then Exit; //写入新的地址 WriteProcessMemory(hProcess,BaseAddr,@NewAddr,8,dwReserved); end; //恢复拦截 procedure TNtHookClass.UnHook; var dwReserved:DWORD; begin if (ReadOK=False) then Exit; //恢复地址 WriteProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved); end; end. 至此,unitHook.pas的代码OK了,其中加了详细的注释,在此就不再多做解释。现在切换到Dll的代码页,写入以下代码: library hookdll; uses SysUtils, Windows, Classes, unitHook in 'unitHook.pas'; {$R *.res} const HOOK_MEM_FILENAME = 'tmp.hkt'; var hhk: HHOOK; Hook: array[0..3] of TNtHookClass; //内存映射 MemFile: THandle; startPid: PDWORD; //保存PID {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //拦截 MessageBoxA function NewMessageBoxA(_hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; type TNewMessageBoxA = function (_hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; begin lpText := PAnsiChar('已经被拦截 MessageBoxA'); Hook[0].UnHook; Result := TNewMessageBoxA(Hook[0].BaseAddr)(_hWnd, lpText, lpCaption, uType); Hook[0].Hook; end; //拦截 MessageBoxW function NewMessageBoxW(_hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall; type TNewMessageBoxW = function (_hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall; begin lpText := '已经被拦截 MessageBoxW'; Hook[2].UnHook; Result := TNewMessageBoxW(Hook[2].BaseAddr)(_hWnd, lpText, lpCaption, uType); Hook[2].Hook; end; //拦截 MessageBeep function NewMessageBeep(uType: UINT): BOOL; stdcall; type TNewMessageBeep = function (uType: UINT): BOOL; stdcall; begin Result := True; end; //拦截 OpenProcess , 防止关闭 function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall; type TNewOpenProcess = function (dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall; begin if startPid^ = dwProcessId then begin result := 0; Exit; end; Hook[3].UnHook; Result := TNewOpenProcess(Hook[3].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId); Hook[3].Hook; end; {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //安装API Hook procedure InitHook; begin Hook[0] := TNtHookClass.Create('user32.dll', 'MessageBoxA', @NewMessageBoxA); Hook[1] := TNtHookClass.Create('user32.dll', 'MessageBeep', @NewMessageBeep); Hook[2] := TNtHookClass.Create('user32.dll', 'MessageBoxW', @NewMessageBoxW); Hook[3] := TNtHookClass.Create('kernel32.dll', 'OpenProcess', @NewOpenProcess); end; //删除API Hook procedure UninitHook; var I: Integer; begin for I := 0 to High(Hook) do begin FreeAndNil(Hook[I]); end; end; {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //内存映射共想 procedure MemShared(); begin MemFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MEM_FILENAME); //打开内存映射文件 if MemFile = 0 then begin //打开失败则衉c2建内存映射文件 MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4, HOOK_MEM_FILENAME); end; if MemFile <> 0 then //映射文件到变量 startPid := MapViewOfFile(MemFile,FILE_MAP_ALL_ACCESS,0,0,0); end; //传递消息 function HookProc(nCode, wParam, lParam: Integer): Integer; stdcall; begin Result := CallNextHookEx(hhk, nCode, wParam, lParam); end; //开始HOOK procedure StartHook(pid: DWORD); stdcall; begin startPid^ := pid; hhk := SetWindowsHookEx(WH_CALLWNDPROC, HookProc, hInstance, 0); end; //结束HOOK procedure EndHook; stdcall; begin if hhk <> 0 then UnhookWindowsHookEx(hhk); end; //环境处理 procedure DllEntry(dwResaon: DWORD); begin case dwResaon of DLL_PROCESS_ATTACH: InitHook; //DLL载入 DLL_PROCESS_DETACH: UninitHook; //DLL删除 end; end; exports StartHook, EndHook; begin MemShared; { 分配DLL程序到 DllProc 变量 } DllProc := @DllEntry; { 调用DLL加载处理 } DllEntry(DLL_PROCESS_ATTACH); end. 这样,我们用来hook API 的 Dll 就完工了。 在Dll中,我们还使用到了内存映射,用来实现在拦截全局时的内存共享,如这个例子中需要保存调用此hook的进程句柄,以防止通过任务管理器关闭示例程序。 编译生成 hookdll.dll 文件,就可以使用了。现在我们再来建立一个测试用的程序。 如附图所示,画3个按钮,分别为"Hook"、"UnHook"、"MessageBox",前两个用来安装和删除钩子,第三个用来显示一个消息框,你将会看到被Hook后的情况。测试工程的代码如下: unit FMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMain = class(TForm) btnHook: TButton; btnUnhook: TButton; Button1: TButton; procedure btnHookClick(Sender: TObject); procedure btnUnhookClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; procedure StartHook(pid: DWORD); stdcall; external 'hookdll.dll'; procedure EndHook; stdcall; external 'hookdll.dll'; implementation {$R *.dfm} procedure TfrmMain.btnHookClick(Sender: TObject); begin StartHook(GetCurrentProcessId); end; procedure TfrmMain.btnUnhookClick(Sender: TObject); begin EndHook; end; procedure TfrmMain.Button1Click(Sender: TObject); begin MessageBox(0, 'abdfadfasdf', nil, 0); end; procedure TfrmMain.FormCreate(Sender: TObject); begin end; end. 完成后运行,先不点击"hook"按钮,直接点击MessageBox,你会发现现在已经被拦截了。为什么我们还没有安装钩子就被拦截了呢?程序出错了吗?呵呵。当然没有出错。反过来看看DLL中的一处代码: ............. //环境处理 procedure DllEntry(dwResaon: DWORD); begin case dwResaon of DLL_PROCESS_ATTACH: InitHook; //DLL载入 DLL_PROCESS_DETACH: UninitHook; //DLL删除 end; end; ............ begin MemShared; { 分配DLL程序到 DllProc 变量 } DllProc := @DllEntry; { 调用DLL加载处理 } DllEntry(DLL_PROCESS_ATTACH); end. 可以看到,在DLL装入内存的时候其实就已经调用了InitHook,将要拦截的API拦截了。这时候看看任务管理器能不能关闭我们的程序,试一下就知道还可以,因为我们还没有调用StartHook来传入我们程序的PID,所以还可以被关闭。

删除文件夹及所有文件 不指定

青色咖啡 , 2010/09/14 23:10 , delphi基础 , 评论(0) , 阅读(319) , Via 本站原创
1.既然是windows平台上, 就用shell API. 下面是一个例子:
PHP 代码:
uses ShellAPI;

function DeleteDirectory(const sDir string) : Boolean;
var
  SHFileOpStruct TSHFileOpStruct;
  FromBuf : Array [0..255of Char;
  ToBuf   : Array [0..255of Char;
begin
  //make sure the target directory existing
  if not DirectoryExists(sDirthen
    begin
      Result := False;
      exit;
    end;

  //Initialize SHFileOpStruct.
  Fillchar(SHFileOpStructSizeof(SHFileOpStruct), 0);
  FillChar(FromBufSizeof(FromBuf), 0);
  FillChar(ToBufSizeof(ToBuf), 0);
  StrPCopy(FromBufsDir);
  StrPCopy(ToBuf'');

  //Delete directory and all its subdirectory as well as files.
  //fill out the shell file operation struct.
  With SHFileOpStruct Do
    Begin
      Wnd     := 0;
      wFunc   := FO_DELETE;
      pFrom   := @FromBuf;
      pTo     := @ToBuf;
      fFlags  := FOF_ALLOWUNDO;
      fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
    End;

  //execute the operation and return result.
  Result := (SHFileOperation(SHFileOpStruct) = 0);
end;
两点注意:
1.
要应用shellapi
2. SHFileOperation(...)
可以执行copy, move, renamedelete命令. filefolder/directory对它而言都是一个file object, 没有区别. 具体参数控制可参见MSDN.
 
方法二
//删除指定的目录或文件
 
//Undo默认为false,即直接删除,不能undo,可以选择true,删除到回收站
function nDeleteDir(SrcDir: String;UndoMK:boolean=false):Boolean;
var
 FS: TShFileOpStruct;
begin
 FS.Wnd := Application.Handle;   //应用程序句柄
 FS.wFunc := FO_DELETE;          //表示删除
 FS.pFrom := PChar(SrcDir+#0#0);
 FS.pTo := nil;
 if UndoMK
   then FS.fFlags := FOF_NOCONFIRMATION + FOF_SILENT + FOF_ALLOWUNDO
   // 表示删除到回收站
   else FS.fFlags := FOF_NOCONFIRMATION + FOF_SILENT;
   // 表示不删除到回收站
 FS.lpszProgressTitle := nil;
 Result := (ShFileOperation(FS) = 0);
 End;

 

 
 
方法三
uses中加入ShellApi  
 
自定义下过程  
   
  procedure   TForm1.Deletedir(str:string);  
  Var  
      T:TSHFileOpStruct;  
      P:String;  
  begin  
      P:='c:\update';//
这里改成你要删除的任意目录名,P:=str     str   是传过来的目录路径  
      With   T   do  
      Begin  
          Wnd:=0;  
          wFunc:=FO_DELETE;  
          pFrom:=Pchar(P);  
          pTo:=nil;  
          fFlags:=FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_NOERRORUI;//
标志表明允许恢复,无须确认并不显示出错信息  
          hNameMappings:=nil;  
          lpszProgressTitle:='
正在删除文件夹';  
          fAnyOperationsAborted:=False;  
      End;  
      SHFileOperation(T);  
      Application.MessageBox('
删除成功!','系统提示',64);  
  end;
 
方法四:shellexecute(0,   nil,   'rd',   'c:\update   /Q   /S',   '',   0);
 
方法五:
创建文件夹可以用ForceDirectories函数,可以创建深层文件夹;删除文件夹,可以用到下面的函数,参数为文件夹的路径,如:d:\show
 
uses ShellAPI;
 
function DeleteDirectory(p :String): boolean;
var
f: TSHFILEOPSTRUCT;
begin
FillChar(f, SizeOf(f), 0);
with f do
begin
Wnd := 0;
wFunc := FO_DELETE;
pFrom := PChar(p+#0);
pTo := PChar(p+#0);
fFlags := FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_NOERRORUI;
end;
Result := (SHFileOperation(f) = 0);
end;
 
要简单一点的可以用Winexec调用dos的rd命令,如;winexec('cmd /c rd /s /q d:\show',sw_hide)就一句代码
 
遇到con文件夹可以先用winexec('cmd /c rd /s /q d:\show\con\',sw_hide)把con文件夹删除,再用winexec('cmd /c rd /s /q d:\show',sw_hide)把show删除
until FindNext(sr) <> 0;
FindClose(sr);
end;
RemoveDir(sPath);
end;
 
判断文件夹存在不
if not DirectoryExists("D:\APP1\SetUp")  then
  showmessage("存在")  else
  showmessage("不存在");
end;
if   not Fileexists   ()   then
  begin
    //如果文件不存在
end;
判断Ini文件存在
 
INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,
所以可视化的编程一族,如VBVCVFPDelphi等都提供了读写INI文件
的方法,其中Delphi中操作INI文件,最为简洁,这是因为Delphi3提供了
一个TInifile类,使我们可以非常灵活的处理INI文件。
一、有必要了解INI文件的结构:
;
注释
[
小节名]
关键字=
...
INI
文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是
该关键字的值。
值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI
件中时没有引号,布尔真值用1表示,布尔假值用0表示。
注释以分号“;”开头。
二、定义
1
、在InterfaceUses节增加IniFiles
2
、在Var变量定义部分增加一行:
myinifile:Tinifile;
然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。
三、打开INI文件
myinifile:=Tinifile.create('program.ini');
上面这一行语句将会为变量myinifile与具体的文件program.ini建立联
系,然后,就可以通过变量myinifile,来读写program.ini文件中的关
键字的值了。
值得注意的是,如果括号中的文件名没有指明路径的话,那么这个
Program.ini
文件会存储在Windows目录中,Program.ini文件存储在应
用程序当前目录中的方法是:为其指定完整的路径及文件名。下面的两
条语句可以完成这个功能:
Filename:=ExtractFilePath(Paramstr
(0))+'program.ini';
myinifile:=Tinifile.Create(filename);
四、读取关键字的值
针对INI文件支持的字符串、整型数值、布尔值三种数据类型,
TINIfiles
类提供了三种不同的对象方法来读取INI文件中关键字的值。
假设已定义变量vsvivb分别为stringintegerboolean类型。
vs:=myinifile.Readstring
('
小节名','关键字',缺省值);
vi:=myinifile.Readinteger
('
小节名','关键字',缺省值);
vb:=myinifile.Readbool
('
小节名','关键字',缺省值);
其中缺省值为该INI文件不存在该关键字时返回的缺省值。
五、写入INI文件
同样的,TInifile类也提供了三种不同的对象方法,向INI文件写
入字符串、整型数及布尔类型的关键字。
myinifile.writestring('
小节名','关键字',变量或字符串值);
myinifile.writeinteger('
小节名','关键字',变量或整型数值);
myinifile.writebool('
小节名','关键字',变量或TrueFalse);
当这个INI文件不存在时,上面的语句还会自动创建该INI文件。
六、删除关键字
除了可用写入方法增加一个关键字,Tinifile类还提供了一个删
除关键字的对象方法:
myinifile.DeleteKey('
小节名','关键字');
七、小节操作
增加一个小节可用写入的方法来完成,删除一个小节可用下面的
对象方法:
myinifile.EraseSection('
小节名');
另外Tinifile类还提供了三种对象方法来对小节进行操作:
myinifile.readsection('
小节名',TStrings变量);可将指定小节中的
所有关键字名读取至一个字符串列表变量中;
myinifile.readsections(TStrings
变量);可将INI文件中所有小节名读
取至一个字符串列表变量中去。
myinifile.readsectionvalues('
小节名',TStrings变量);可将INI文件
中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变
量中去。
八、释放
在适当的位置用下面的语句释放myinifile
myinifile.distory;
九、一个实例
下面用一个简单的例子(如图),演示了建立、读取、存贮INI文件的方
法。myini.ini文件中包含有程序参数小节,和用户名称(字符串
)、是否正式用户(布尔值)和已运行时间(整型值)三个关键字。
程序在窗体建立读取这些数据,并在窗体释放时写myini.ini文件。
附源程序清单
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,
Controls,Forms,Dialogs,inifiles,StdCtrls,ExtCtrls;
type
TForm1=class(TForm)
Edit1:TEdit;
CheckBox1:TCheckBox;
Edit2:TEdit;
Label1:TLabel;
Label2:TLabel;
Timer1:TTimer;
Label3:TLabel;
procedureFormCreate(Sender:TObject);
procedureFormDestroy(Sender:TObject);
procedureTimer1Timer(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:TForm1;
implementation
var
myinifile:TInifile;
{$R*.DFM}
procedureTForm1.FormCreate(Sender:TObject);
var
filename:string;
begin
filename:=ExtractFilePath(paramstr(0))+'myini.ini';
myinifile:=TInifile.Create(filename);
edit1.Text:=myinifile.readstring
('
程序参数','用户名称','缺省的用户名称');
edit2.text:=inttostr(myinifile.readinteger
('
程序参数','已运行时间',0));
checkbox1.Checked:=myinifile.readbool
('
程序参数','是否正式用户',False);
end;
procedureTForm1.FormDestroy(Sender:TObject);
begin
myinifile.writestring('
程序参数','用户名称',edit1.Text);
myinifile.writeinteger('
程序参数','已运行时间',
strtoint(edit2.text));
myinifile.writebool('
程序参数','是否正式用户',
checkbox1.Checked);
myinifile.Destroy;
end;
procedureTForm1.Timer1Timer(Sender:TObject);
begin
edit2.Text:=inttostr(strtoint(edit2.text)+1);
end;
end.
程序在Pwin95Delphi3下调试通过。  
----------------------------------------------------------------------
演示程序如下:(注意:在 users 中必须包含 IniFiles
procedure TMainForm.DemoInfo;
var
InfoFile:TIniFile;
UserName,UserClass:string;
begin
//
创建对象
InfoFile:=TIniFile.Create('c:\demo.ini');
//
读字符,readstring(主键,键名,缺省值)
UserName:=InfoFile.ReadString('user','username','demo');
//
写字符,writestring(主键,键名,键值)
InfoFile.WriteString('user','age','18');
//
删除键,DeleteKey(主键,键名)
InfoFile.DeleteKey('class','userclass');
//
删除主键,EraseSection(主键)
InfoFile.EraseSection('class');
//
释放对象
InfoFile.Free;
end;
--------------------------------------------------------
控制INI文件几种方法
Windows中利用.INI文件做程序有关数据的存储工作是很常见的,其中涉及了读和写.INI文件问题,下面就介绍几种不同的方法给大家参考:
.INI文件中获取字符串
var
strResult:pchar;
begin
GetPrivateProfileString(
'windows', // []
中标题的名字
'NullPort', // =
号前的名字
'NIL', //
如果没有找到字符串时,返回的默认值
strResult, //
存放取得字符
100, //
取得字符的允许最大长度
'c:\forwin95\win.ini' //
调用的文件名
);
edit1.text:=strResult; //
显示取得字符串
.INI文件中获取整数
edit1.text:=inttostr(GetPrivateProfileInt(
'intl', // []
中标题的名字
'iCountry', // =
号前的名字
0,//
如果没有找到整数时,返回的默认值
'c:\forwin95\win.ini' //
调用的文件名
));
.INI文件写入字符串
WritePrivateProfileString(
'windows', // []
中标题的名字
'load', //
要写入“=”号前的字符串
'accca', //
要写入的数据
'c:\forwin95\win.ini' //
调用的文件名
);
.INI文件写入整数
WritePrivateProfileSection(
'windows', // []
中标题的名字
'read=100', //
要写入的数据
'c:\forwin95\win.ini' //
调用的文件名
);
上面的方法是调用API函数,下面介绍另一种不用API,而是使用TIniFile.INI文件中获取字符的方法
.INI文件中读字符
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');//
调用的文件名
edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');//
取得字符
end;
.INI文件中写入字符
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');//
调用的文件名
DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.jpg');//
写入字符
end;
下面的是本人自制的读INI文件函数,也提供给大家参考:
function GetINIfile(lpAppNameL,lpKeyName,lpDefault:string;
lpsize:integer;lpFileName:string):string;
{
读取ini文件函数}
var f:textfile;
sn:string;
begin
assignfile(f,lpFileName);
reset(f);
repeat
readln(f,sn);
if sn='['+lpAppNameL+']' then
begin
readln(f,sn);
while(copy(sn,1,1)<>'[')or(not(eof(f)))do
begin
if copy(sn,1,pos('=',sn)-1)=lpKeyName then
begin
GetINIfile:=copy(sn,pos('=',sn)+1,lpsize);
exit;
end;
readln(f,sn);
end;
end
else GetINIfile:=lpDefault;
until eof(f);
closefile(f);
end;
{------------}
调用方法是:
var Timeout:String;
begin
Timeout:=GetINIfile('MailSetup','Timeout','0',5,prgpath+'\CNMSet.ini');
end;  
-------------------------------------------------------------
FileExists
函数 判断文件是否存在
FPath:=ExtractFielPath(Paramstr(0))+'FName.ini'
If Not FileExists('FPath') then
 

说一下思路
首先运行程序
ShellExecute(0, 'open',PChar(jddir+'JDRJNOD32.exe'),nil,nil, SW_SHOWNORMAL);
然后用Spy++ 找到该程序窗口标题,然后获取该程序的句柄。通过以下代码使自动化程序窗口弹出来并获得焦点。
procedure Findexehwnd;
var
   h:THandle;
   buf:array[0..255] of char;
begin
   FillChar(buf,sizeof(buf),0);
   h := GetForegroundWindow();
   while (h<>0) do
   begin
      GetWindowText(h, buf, 255);
      if (AnsiContainsStr(buf, '极点NOD32升级ID获取器 V2010 Beta Build 3.0')) then
      begin
       IsWindow(h);
       if IsWindow(h) then
      begin
      SetForegroundWindow(h);
      ShowWindow(h,SW_RESTORE);
      end;
      end;
      h:=GetNextWindow(h,2);
      end;
       end;
提示用户键盘鼠标不要操作。


用键盘模拟TAB键选择按键焦点,模拟回车操作

安装目录要选择的话可以 直接 copy del改变目录,具体代码我就不打了。

至于安装完之后再安装下一个之前判断该安装程序进程在不在或者句柄在不在,然后进行下一个操作。

分页: 4/26 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]