公布+测试:一个对自身EXE写数据的类,可有效保存一些设置数据,欢迎大家测试,我只在98下通过。(50分)

  • 主题发起人 主题发起人 testnet
  • 开始时间 开始时间
T

testnet

Unregistered / Unconfirmed
GUEST, unregistred user!
unit TWriteMePas;

{
; ;功 ; ;能:向当前可执行文件写入数据
; ;使用方法:只要USES TWriteMePas,就可以引用WriteMe这个变量
; ; ; ; ; ; ;function TWriteMe.Read():string; 读数据
; ; ; ; ; ; ;procedure TWriteMe.Write(const atag:string); 写数据
; ;作 ; ;者:testnet
; ;备 ; ;注:我是从一篇相关的帖子上得到启发的,但忘了是哪篇,当时我只看了
; ; ; ; ; ; ; 一下,没太在意,大家可以先看看哪篇。有好的建议OR发现BUG请告诉我,谢谢!

}

interface
uses
; Classes,Windows, SysUtils;
type
; ;TWriteMe=class
; ; ; ; ; ; ; ;public
; ; ; ; ; ; ; ; ; function Read():string;
; ; ; ; ; ; ; ; ; procedure Write(const atag:string);
; ; ; ; ; ; ; ; ; constructor Create(); overload;
; ; ; ; ; ; ; ; ; destructor Destroy; override;
; ; ; ; ; ; ; ; ; function ;Enable():boolean;
; ; ; ; ; ; ; ;private
; ; ; ; ; ; ; ; ; FileSize:int64; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; TagSize :integer;
; ; ; ; ; ; ; ; ; hfile:TFileStream;
; ; ; ; ; ; ; ; ; szSrc, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ; szDest ; ;: array[0..MAX_PATH] of char; ; ; ; ;
; ; ; ; ; ; ; ; ; szCmdLine : string;
; ; ; ; ; ; ; ; ; hProcess ;: THandle;
; ; ; ; ; ; ; ; ; SI ; ; ; ;: TStartupInfo;
; ; ; ; ; ; ; ; ; PI ; ; ; ;: TProcessInformation;
; ; ; ; ; ; ; ; ; FEnable ; :Boolean;
; ; ; ; ; ; ; ; ; procedure KillMe();
; ; ; ; ; ; ; ; ; procedure NoParameter();
; ; ; ; ; ; ; ; ; procedure HaveParameter();

; ; ; ; ; ; ;end;

var
; WriteMe :TWriteMe;
implementation
uses
; ShellApi;

procedure TWriteMe.KillMe;
var
; BatFile:TextFile;
begin
; ;AssignFile(BatFile,'Kill.bat');
; ;ReWrite(BatFile);
; ;try
; ; ;writeln(BatFile,'del ',ParamStr(0));
; ; ;Writeln(BatFile,'del ','Kill.bat');
; ;finally
; ; ;closeFile(BatFile);
; ;end;
; ;ShellExecute(0,'open','Kill.bat',nil,nil,0);

end;


procedure ;TWriteMe.NoParameter();
begin
; GetModuleFileName(0, szSrc, MAX_PATH);
; ;GetTempPath(MAX_PATH, szDest);
; ;GetTempFileName(szDest, 'Tmp', 0, szDest);
; ;CopyFile(szSrc, szDest, FALSE); ; ; ; ; ; ; ; ;


; ;hProcess := OpenProcess(SYNCHRONIZE,
; ; ; ; ; ; ; ; ; ; ; ; ; ;TRUE,
; ; ; ; ; ; ; ; ; ; ; ; ; ;GetCurrentProcessId); ;


; ;szCmdLine := Format('%s %d "%s"', [szDest, hProcess, szSrc]);

; ;FillChar(SI, SizeOf(SI), 0);
; ;SI.cb := SizeOf(SI);

; ;CreateProcess(nil, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;PChar(szCmdLine), ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;nil, ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;nil, ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;TRUE, ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;NORMAL_PRIORITY_CLASS, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;nil, ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;nil, ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;SI, ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; ; ; ; ; ; ; ;PI); ; ; ; ; ; ; ; ; ; ; ; ; ;

; ;CloseHandle(hProcess);
end;

procedure TWriteMe.HaveParameter();
begin
; ;FEnable:=true;
; ;hProcess := THANDLE(StrToInt(ParamStr(1)));
; ;WaitForSingleObject(hProcess, INFINITE); ; ; ;
; ;SetCurrentDirectory(PChar(paramstr(2)));
; ;CloseHandle(hProcess);

; hfile:=TFileStream.Create(paramstr(2),fmOpenReadWrite);
; ;if hFile<>nil then
; ; ; begin
; ; ; ; try
; ; ; ; ; hfile.Seek($80,soFromBeginning);
; ; ; ; ; hfile.Read(FileSize,sizeof(FileSize));
; ; ; ; ; if FileSize=0 then
; ; ; ; ; ; begin
; ; ; ; ; ; ; FileSize:=hfile.Size;
; ; ; ; ; ; ; hfile.Seek($80,soFromBeginning);
; ; ; ; ; ; ; hfile.Write(FileSize,sizeof(FileSize));
; ; ; ; ; ; end
; ; ; ; ; else
; ; ; ; ; ; begin

; ; ; ; ; ; end;

; ; ; ; finally
; ; ; ; ; hFile.Free ;
; ; ; ; end;
; ; ; end;
end;

function TWriteMe.Read():string;
begin
; hfile:=TFileStream.Create(paramstr(2),fmOpenReadWrite);
; ;if hFile<>nil then
; ; ; begin
; ; ; ; try
; ; ; ; ; hfile.Seek($90,soFromBeginning);
; ; ; ; ; hfile.Read(TagSize,sizeof(TagSize));
; ; ; ; ; if TagSize=0 then
; ; ; ; ; ; begin
; ; ; ; ; ; ; result:='';
; ; ; ; ; ; end
; ; ; ; ; else
; ; ; ; ; ; begin
; ; ; ; ; ; ; ;hfile.Seek($80,soFromBeginning);
; ; ; ; ; ; ; ;hfile.Read(FileSize,sizeof(FileSize));
; ; ; ; ; ; ; ;hFile.Seek(FileSize,soFromBeginning);
; ; ; ; ; ; ; ;setlength(Result,TagSize);
; ; ; ; ; ; ; ;hFile.Read(Result[1],TagSize);
; ; ; ; ; ; end;

; ; ; ; finally
; ; ; ; ; hFile.Free ;
; ; ; ; end;
; ; ; end;

end;

procedure TWriteMe.Write(const atag:string);
begin
; hFile:=TFileStream.Create(paramstr(2),fmOpenReadWrite);
; if hFile<>nil then
; begin
; ; try
; ; ; ;hFile.Seek($80,soFromBeginning);
; ; ; ;hFile.Read(FileSize,Sizeof(FileSize));
; ; ; ;hFile.Seek($90,soFromBeginning);
; ; ; ;TagSize:=length(atag);
; ; ; ;hFile.Write(TagSize,SizeOf(TagSize));
; ; ; ;hFile.Seek(FileSize,soFromBeginning);
; ; ; ;hFile.Write(atag[1],TagSize);
; ; finally
; ; ; hFile.Free;
; ; end;
; end;
end;

constructor TWriteMe.Create();
begin
; inherited Create();
; FEnable:=false;
; ; ; if ParamCount=0 then
; ; ; ; NoParameter
; ; ; else
; ; ; ; HaveParameter;
end;

destructor TWriteMe.Destroy;
begin
; inherited Destroy;
end;

function TWriteMe.Enable:Boolean;
begin
; result:=FEnable;
end;

initialization
; WriteMe:=TWriteMe.Create;
; if not WriteMe.Enable then
; ; halt;

finalization
; if WriteMe.Enable then
; ; WriteMe.KillMe;
; WriteMe.Free;

end.
 
你这个也挺好用的。 但在exe中都是明码而且是存在文件尾部的。
如果能用二进制合在exe里面就最好了。

我以前写的是在exe定义一个const 变量 留一定空间然后运行是去找这个变量。
但有局限性。 比如不能用aspack压缩。
 
拿回去研究研究!
 
好帖好帖!!
 
TWriteMe B 版准备完成.支持事件,命令行参数,最重要方便使用,只是速度减低了.
 
多人接受答案了。
 
后退
顶部