ʲôÊÇÁ÷£¿Á÷,¼òµ¥À´Ëµ¾ÍÊǽ¨Á¢ÔÚÃæÏò¶ÔÏó»ù´¡ÉϵÄÒ»ÖÖ³éÏóµÄ´¦ÀíÊý¾Ý µÄ¹¤¾ß¡£ÔÚÁ÷ÖУ¬¶¨ÒåÁËһЩ´¦ÀíÊý¾ÝµÄ»ù±¾²Ù×÷£¬Èç¶ÁÈ¡Êý¾Ý£¬Ð´ÈëÊý¾ÝµÈ£¬³ÌÐòÔ±ÊǶÔÁ÷½øÐÐËùÓвÙ×÷µÄ£¬¶ø²»ÓùØÐÄÁ÷µÄÁíһͷÊý¾ÝµÄÕæÕýÁ÷Ïò¡£Á÷²»µ«¿ÉÒÔ´¦ÀíÎļþ£¬»¹¿ÉÒÔ´¦Àí¶¯Ì¬ÄÚ´æ¡¢ÍøÂçÊý¾ÝµÈ¶àÖÖÊý¾ÝÐÎʽ¡£Èç¹ûÄã¶ÔÁ÷µÄ²Ù×÷·Ç³£ÊìÁ·£¬ÔÚ³ÌÐòÖÐÀûÓÃÁ÷µÄ·½±ãÐÔ£¬Ð´Æð³ÌÐò»á´ó´óÌá¸ßЧÂʵġ£
ÏÂÃæ£¬±ÊÕßͨ¹ýËĸöʵÀý:EXEÎļþ¼ÓÃÜÆ÷¡¢µç×Ӻؿ¨¡¢×ÔÖÆOICQºÍÍøÂçÆÁÄ»´«ÊäÀ´ËµÃ÷Delphi±à³ÌÖС°Á÷¡±µÄÀûÓá£ÕâЩÀý×ÓÖеÄһЩ¼¼ÇÉÔø¾ÊǺܶàÈí¼þµÄÃØÃܶø²»¹«¿ªµÄ£¬ÏÖÔÚ´ó¼Ò¿ÉÒÔÎÞ³¥µÄÖ±½ÓÒýÓÃÆäÖеĴúÂëÁË¡£
¡°ÍòÕɸߥƽµØÆð¡±£¬ÔÚ·ÖÎöʵÀý֮ǰ£¬ÎÒÃÇÏÈÀ´Á˽âÒ»ÏÂÁ÷µÄ»ù±¾¸ÅÄîºÍº¯Êý£¬Ö»ÓÐÔÚÀí½âÁËÕâЩ»ù±¾µÄ¶«Î÷ºóÎÒÃDzÅÄܽøÐÐÏÂÒ»²½¡£ÇëÎñ±ØÈÏÕæÁì»áÕâЩ»ù±¾·½·¨¡£µ±È»£¬Èç¹ûÄã¶ÔËüÃÇÒѾºÜÊìϤÁË£¬Ôò¿ÉÒÔÌø¹ýÕâÒ»²½¡£
Ò»¡¢DelphiÖÐÁ÷µÄ»ù±¾¸ÅÄî¼°º¯ÊýÉùÃ÷
ÔÚDelphiÖУ¬ËùÓÐÁ÷¶ÔÏóµÄ»ùÀàΪTStreamÀ࣬ÆäÖж¨ÒåÁËËùÓÐÁ÷µÄ¹²Í¬ÊôÐԺͷ½·¨¡£
TStreamÀàÖж¨ÒåµÄÊôÐÔ½éÉÜÈçÏ£º
¡¡¡¡1¡¢Size:´ËÊôÐÔÒÔ×Ö½Ú·µ»ØÁ÷ÖÐÊý¾Ý´óС¡£
¡¡¡¡2¡¢Position:´ËÊôÐÔ¿ØÖÆÁ÷ÖдæÈ¡Ö¸ÕëµÄλÖá£
TstreamÖж¨ÒåµÄÐé·½·¨ÓÐËĸö£º
1¡¢Read:´Ë·½·¨ÊµÏÖ½«Êý¾Ý´ÓÁ÷ÖжÁ³ö¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
¡¡¡¡²ÎÊýBufferΪÊý¾Ý¶Á³öʱ·ÅÖõĻº³åÇø£¬CountΪÐèÒª¶Á³öµÄÊý¾ÝµÄ×Ö½ÚÊý£¬¸Ã·½·¨·µ»ØÖµÎªÊµ¼Ê¶Á³öµÄ×Ö½ÚÊý£¬Ëü¿ÉÒÔС¡¡¡¡ÓÚ»òµÈÓÚCountÖÐÖ¸¶¨µÄÖµ¡£
2¡¢Write:´Ë·½·¨ÊµÏÖ½«Êý¾ÝдÈëÁ÷ÖС£º¯ÊýÔÐÎΪ£º
¡¡¡¡Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;
¡¡¡¡²ÎÊýBufferΪ½«ÒªÐ´ÈëÁ÷ÖеÄÊý¾ÝµÄ»º³åÇø£¬CountΪÊý¾ÝµÄ³¤¶È×Ö½ÚÊý£¬¸Ã·½·¨·µ»ØÖµÎªÊµ¼ÊдÈëÁ÷ÖеÄ×Ö½ÚÊý¡£
3¡¢Seek:´Ë·½·¨ÊµÏÖÁ÷ÖжÁȡָÕëµÄÒÆ¶¯¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
¡¡¡¡²ÎÊýOffsetÎªÆ«ÒÆ×Ö½ÚÊý,²ÎÊýOrigintÖ¸³öOffsetµÄʵ¼ÊÒâÒ壬Æä¿ÉÄܵÄȡֵÈçÏ£º
¡¡¡¡soFromBeginning:OffsetÎªÒÆ¶¯ºóÖ¸Õë¾àÀëÊý¾Ý¿ªÊ¼µÄλÖᣴËʱOffset±ØÐë´óÓÚ»òÕßµÈÓÚÁã¡£
¡¡¡¡soFromCurrent:OffsetÎªÒÆ¶¯ºóÖ¸ÕëÓ뵱ǰָÕëµÄÏà¶ÔλÖá£
¡¡¡¡soFromEnd:OffsetÎªÒÆ¶¯ºóÖ¸Õë¾àÀëÊý¾Ý¿ªÊ¼µÄλÖᣴËʱOffset±ØÐëСÓÚ»òÕßµÈÓÚÁã¡£
¡¡¡¡¸Ã·½·¨·µ»ØÖµÎªÒƶ¯ºóÖ¸ÕëµÄλÖá£
4¡¢Setsize:´Ë·½·¨ÊµÏָıäÊý¾ÝµÄ´óС¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡Function Setsize(NewSize:Longint);virtual;
¡¡¡¡ÁíÍ⣬TStreamÀàÖл¹¶¨ÒåÁ˼¸¸ö¾²Ì¬·½·¨£º
¡¡¡¡1¡¢ReadBuffer:´Ë·½·¨µÄ×÷ÓÃÊÇ´ÓÁ÷Öе±Ç°Î»ÖöÁÈ¡Êý¾Ý¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡¡¡¡¡Procedure ReadBuffer(var Buffer;Count:Longint);
¡¡¡¡¡¡¡¡²ÎÊýµÄ¶¨Òå¸úÉÏÃæµÄReadÏàͬ¡£×¢Ò⣺µ±¶ÁÈ¡µÄÊý¾Ý×Ö½ÚÊýÓëÐèÒª¶ÁÈ¡µÄ×Ö½ÚÊý²»Ïàͬʱ£¬½«²úÉúEReadErrorÒì³£¡£
¡¡¡¡2¡¢WriteBuffer:´Ë·½·¨µÄ×÷ÓÃÊÇÔÚµ±Ç°Î»ÖÃÏòÁ÷дÈëÊý¾Ý¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡¡¡¡¡Procedure WriteBuffer(var Buffer;Count:Longint);
¡¡¡¡¡¡¡¡²ÎÊýµÄ¶¨Òå¸úÉÏÃæµÄWriteÏàͬ¡£×¢Ò⣺µ±Ð´ÈëµÄÊý¾Ý×Ö½ÚÊýÓëÐèҪдÈëµÄ×Ö½ÚÊý²»Ïàͬʱ£¬½«²úÉúEWriteErrorÒì³£¡£
¡¡¡¡3¡¢CopyFrom:´Ë·½·¨µÄ×÷ÓÃÊÇ´ÓÆäËüÁ÷Öп½±´Êý¾ÝÁ÷¡£º¯ÊýÔÐÎΪ£º
¡¡¡¡¡¡¡¡Function CopyFrom(Source:TStream;Count:Longint):Longint;
¡¡¡¡¡¡¡¡²ÎÊýSourceΪÌṩÊý¾ÝµÄÁ÷£¬CountΪ¿½±´µÄÊý¾Ý×Ö½ÚÊý¡£µ±Count´óÓÚ0ʱ£¬CopyFrom´ÓSource²ÎÊýµÄµ±Ç°Î»Öÿ½±´Count¸ö×Ö½ÚµÄÊý¾Ý£»µ±CountµÈÓÚ0ʱ£¬CopyFromÉèÖÃSource²ÎÊýµÄPositionÊôÐÔΪ0,È»ºó¿½±´SourceµÄËùÓÐÊý¾Ý£»
TStream»¹ÓÐÆäËüÅÉÉúÀ࣬ÆäÖÐ×î³£ÓõÄÊÇTFileStreamÀࡣʹÓÃTFileStreamÀàÀ´´æÈ¡Îļþ£¬Ê×ÏÈÒª½¨Á¢Ò»¸öʵÀý¡£ÉùÃ÷ÈçÏ£º
constructor Create(const Filename:string;Mode:Word);
FilenameΪÎļþÃû£¨°üÀ¨Â·¾¶£©,²ÎÊýModeΪ´ò¿ªÎļþµÄ·½Ê½£¬Ëü°üÀ¨ÎļþµÄ´ò¿ªÄ£Ê½ºÍ¹²Ïíģʽ£¬Æä¿ÉÄܵÄȡֵºÍÒâÒåÈçÏ£º
´ò¿ªÄ£Ê½£º
fmCreate :ÓÃÖ¸¶¨µÄÎļþÃû½¨Á¢Îļþ£¬Èç¹ûÎļþÒѾ´æÔÚÔò´ò¿ªËü¡£
fmOpenRead :ÒÔÖ»¶Á·½Ê½´ò¿ªÖ¸¶¨Îļþ
fmOpenWrite :ÒÔֻд·½Ê½´ò¿ªÖ¸¶¨Îļþ
fmOpenReadWrite:ÒÔдд·½Ê½´ò¿ªÖ¸¶¨Îļþ
¹²Ïíģʽ£º
fmShareCompat :¹²ÏíģʽÓëFCBs¼æÈÝ
fmShareExclusive:²»ÔÊÐí±ðµÄ³ÌÐòÒÔÈκη½Ê½´ò¿ª¸ÃÎļþ
fmShareDenyWrite:²»ÔÊÐí±ðµÄ³ÌÐòÒÔд·½Ê½´ò¿ª¸ÃÎļþ
fmShareDenyRead :²»ÔÊÐí±ðµÄ³ÌÐòÒÔ¶Á·½Ê½´ò¿ª¸ÃÎļþ
fmShareDenyNone :±ðµÄ³ÌÐò¿ÉÒÔÒÔÈκη½Ê½´ò¿ª¸ÃÎļþ
TStream»¹ÓÐÒ»¸öÅÉÉúÀàTMemoryStream£¬Êµ¼ÊÓ¦ÓÃÖÐÓõĴÎÊýÒ²·Ç³£Æµ·±¡£Ëü½ÐÄÚ´æÁ÷£¬¾ÍÊÇ˵ÔÚÄÚ´æÖн¨Á¢Ò»¸öÁ÷¶ÔÏó¡£ËüµÄ»ù±¾·½·¨ºÍº¯Êý¸úÉÏÃæÊÇÒ»ÑùµÄ¡£
ºÃÁË£¬ÓÐÁËÉÏÃæµÄ»ù´¡ºó£¬ÎÒÃǾͿÉÒÔ¿ªÊ¼ÎÒÃǵıà³ÌÖ®ÐÐÁË¡£
¶þ¡¢Êµ¼ÊÓ¦ÓÃÖ®Ò»£ºÀûÓÃÁ÷ÖÆ×÷EXEÎļþ¼ÓÃÜÆ÷¡¢À¦°ó¡¢×Ô½âѹÎļþ¼°°²×°³ÌÐò
ÎÒÃÇÏÈÀ´ËµÒ»ÏÂÈçºÎÖÆ×÷Ò»¸öEXEÎļþ¼ÓÃÜÆ÷°É¡£
EXEÎļþ¼ÓÃÜÆ÷µÄÔÀí£º½¨Á¢Á½¸öÎļþ£¬Ò»¸öÓÃÀ´Ìí¼Ó×ÊÔ´µ½ÁíÍâÒ»¸öEXEÎļþÀïÃæ£¬³ÆÎªÌí¼Ó³ÌÐò¡£ÁíÍâÒ»¸ö±»Ìí¼ÓµÄEXEÎļþ³ÆÎªÍ·Îļþ¡£¸Ã³ÌÐòµÄ¹¦ÄÜÊǰÑÌí¼Óµ½×Ô¼ºÀïÃæµÄÎļþ¶Á³öÀ´¡£
WindowsϵÄEXEÎļþ½á¹¹±È½Ï¸´ÔÓ£¬ÓеijÌÐò»¹ÓÐУÑéºÍ£¬µ±·¢ÏÖ×Ô¼º±»¸Ä±äºó»áÈÏΪ×Ô¼º±»²¡¶¾¸ÐȾ¶ø¾Ü¾øÖ´ÐС£ËùÒÔÎÒÃǰÑÎļþÌí¼Óµ½×Ô¼ºµÄ³ÌÐòÀïÃæ£¬ÕâÑù¾Í²»»á¸Ä±äÔÀ´µÄÎļþ½á¹¹ÁË¡£ÎÒÃÇÏÈдһ¸öÌí¼Óº¯Êý£¬¸Ãº¯ÊýµÄ¹¦ÄÜÊǰÑÒ»¸öÎļþµ±×÷Ò»¸öÁ÷Ìí¼Óµ½ÁíÍâÒ»¸öÎļþµÄβ²¿¡£º¯ÊýÈçÏ£º
Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//Íùβ²¿Ìí¼Ó×ÊÔ´
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//¼ÆËã×ÊÔ´´óС£¬²¢Ð´È븨³Ìβ²¿
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
ÓÐÁËÉÏÃæµÄ»ù´¡£¬ÎÒÃÇÓ¦¸ÃºÜÈÝÒ׿´µÃ¶®Õâ¸öº¯Êý¡£ÆäÖвÎÊýSourceFileÊÇÒªÌí¼ÓµÄÎļþ,²ÎÊýTargetFileÊDZ»Ìí¼Óµ½µÄÄ¿±êÎļþ¡£±ÈÈç˵°Ña.exeÌí¼Óµ½b.exeÀïÃæ¿ÉÒÔ£ºCjt_AddtoFile('a.exe',b.exe');Èç¹ûÌí¼Ó³É¹¦¾Í·µ»ØTrue·ñÔò·µ»Ø¼Ù¡£
¸ù¾ÝÉÏÃæµÄº¯ÊýÎÒÃÇ¿ÉÒÔд³öÏà·´µÄ¶Á³öº¯Êý£º
Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize:integer;
begin
try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//¶Á³ö×ÊÔ´´óС
Source.Seek(-MyFileSize,soFromEnd);//¶¨Î»µ½×ÊԴλÖÃ
Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//È¡³ö×ÊÔ´
Target.SaveToFile(TargetFile);//´æ·Åµ½Îļþ
finally
Target.Free;
Source.Free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;
ÆäÖвÎÊýSourceFileÊÇÒѾÌí¼ÓÁËÎļþµÄÎļþÃû³Æ,²ÎÊýTargetFileÊÇÈ¡³öÎļþºó±£´æµÄÄ¿±êÎļþÃû¡£±ÈÈç˵Cjt_LoadFromFile('b.exe','a.txt');ÔÚb.exeÖÐÈ¡³öÎļþ±£´æÎªa.txt¡£Èç¹ûÈ¡³ö³É¹¦¾Í·µ»ØTrue·ñÔò·µ»Ø¼Ù¡£
´ò¿ªDelphi£¬Ð½¨Ò»¸ö¹¤³Ì£¬ÔÚ´°¿ÚÉÏ·ÅÉÏÒ»¸öEdit¿Ø¼þEdit1ºÍÁ½¸öButton:
Button1ºÍButton2¡£ButtonµÄCaptionÊôÐÔ·Ö±ðÉèÖÃΪ¡°È·¶¨¡±ºÍ¡°È¡Ïû¡±¡£ÔÚ
Button1µÄClickʼþÖÐд´úÂë:
var S:string;
begin
S:=ChangeFileExt(Application.ExeName,'.Cjt');
if Edit1.Text='790617' then
begin
Cjt_LoadFromFile(Application.ExeName,S);
{È¡³öÎļþ±£´æÔÚµ±Ç°Â·¾¶Ï²¢ÃüÃû"ÔÎļþ.Cjt"}
Winexec(pchar(S),SW_Show);{ÔËÐÐ"ÔÎļþ.Cjt"}
Application.Terminate;{Í˳ö³ÌÐò}
end
else
Application.MessageBox('ÃÜÂë²»¶Ô,ÇëÖØÐÂÊäÈ룡','ÃÜÂë´íÎó',MB_ICONERROR+MB_OK);
±àÒëÕâ¸ö³ÌÐò£¬²¢°ÑEXEÎļþ¸ÄÃûΪhead.exe¡£Ð½¨Ò»¸öÎı¾Îļþhead.rc,ÄÚÈÝΪ: head exefile head.exe,È»ºó°ÑËüÃÇ¿½±´µ½DelphiµÄBINĿ¼Ï£¬Ö´ÐÐDosÃüÁîBrcc32.exe head.rc,½«²úÉúÒ»¸öhead.resµÄÎļþ£¬Õâ¸öÎļþ¾ÍÊÇÎÒÃÇÒªµÄ×ÊÔ´Îļþ£¬ÏÈÁô×Å¡£
ÎÒÃǵÄÍ·ÎļþÒѾ½¨Á¢ÁË£¬ÏÂÃæÎÒÃÇÀ´½¨Á¢Ìí¼Ó³ÌÐò¡£
н¨Ò»¸ö¹¤³Ì£¬·ÅÉÏÒÔÏ¿ؼþ£ºÒ»¸öEdit,Ò»¸öOpendialog,Á½¸öButton1µÄCaptionÊôÐÔ·Ö±ðÉèÖÃΪ"Ñ¡ÔñÎļþ"ºÍ"¼ÓÃÜ"¡£
ÔÚÔ´³ÌÐòÖÐÌí¼ÓÒ»¾ä:{$R head.res}²¢°Ñhead.resÎļþ¿½±´µ½³ÌÐòµ±Ç°Ä¿Â¼Ï¡£