把ini文件以资源方式加入exe中,运行exe时,不释放这个ini文件,而是直接进行读写操作。
程序运行后每隔一秒向ini中写入字符串,后写入的字符串覆盖掉先前写入的。
程序启动时,能读取这个ini文件中最后一次写入的字符串。由于程序在运行中,往自身的资源文件ini文件写入字符串,这样的代码,没有写过,发个帖请教加学习!
给出代码者200分独得
如果谁有此代码,请帮忙发一份。

解决方案 »

  1.   

    exe运行时写不了res,可以考虑退出exe时,释放另外一个exe(资源文件里的)向他写入资源
      

  2.   

    听说过有内存执行文件的方法的,MARK学习下
      

  3.   

    就是更新exe自己?
    从功能来说,ini在外部也是一样的效果
      

  4.   

    直接修改基本上来说是不可能的。可不可以这样,启动读取你内部的资源ini,然后内存操作结束后,在程序退出的时候临时保存这个ini到文件,然后资源文件里面释放一个写好的“合并程序”,将ini合并到exe资源文件中。思路而已。
      

  5.   

    直接写当然运行的exe文件,很难实现.可行的方法是运行文件后,将其本身写入一副本(内存或硬盘临时文件),然后关闭自己,运行副本,在副本中对EXE文件进行资源修改(用API 的UpdateResource)
      

  6.   

    似乎是个无解的问题(至少不能完美解决),不过还是忍不住占个位置,关注ing...
      

  7.   

    exe在运行中,是被系统销定的(不能写),除非在驱动级或绕过系统,但这个的确有很大难度
      

  8.   

    你要先过杀软这关,
    你可以考虑Dump方法!这应该是可行的,但难度很大,应该是五星级的!
      

  9.   

    程序运行时修改资源文件比较难,不过可以用流捆绑,运行后释放到内存,在内存修改再保存。
    不用这个方法,可能只能用副本来完成。
    http://www.2ccc.com/article.asp?articleid=578
      

  10.   

    program SelfModify; uses 
     Windows, 
     Classes, 
     Sysutils, 
     TlHelp32, 
     Forms, 
     Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} Var 
     s: string; 
     a: byte; 
     Handle: THandle; 
     Found: boolean; 
     Lppe: TProcessEntry32; 
    begin 
     s:=''; 
     a:=1; 
     while ParamStr(a)<>'' do 
     begin 
       s:=s+ParamStr(a)+' '; 
       inc(a); 
     end; 
     if s<>'' then 
     begin 
       Handle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); 
       lppe.dwSize:=Sizeof(TProcessEntry32); 
       Found:=Process32First(Handle,Lppe); 
       while Found do 
       begin 
         if pos(Lppe.szExeFile,s)<>0 then 
           TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, True, 
                            Lppe.th32ProcessID),0); 
         Found:= Process32Next(Handle,Lppe); 
       end; 
       CloseHandle(Handle); 
       while FileExists(s) do DeleteFile(s); 
       CopyFile(PChar(ParamStr(0)),PChar(s),True); 
       winexec(PChar(s),SW_SHOW); 
       exit; 
     end; 
     Application.Initialize; 
     Application.CreateForm(TForm1, Form1); 
     Application.Run; 
    end. **************************************************** unit Unit1; interface uses 
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
     ComCtrls, StdCtrls; type 
     TForm1 = class(TForm) 
       Button1: TButton; 
       StatusBar1: TStatusBar; 
       procedure FormCreate(Sender: TObject); 
       procedure Button1Click(Sender: TObject); 
       procedure FormClose(Sender: TObject; var Action: TCloseAction); 
     private 
       { Private declarations } 
     public 
       { Public declarations } 
     end; var 
     Form1: TForm1; 
     TempName: string; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); 
    var 
     Sr: TSearchRec; 
     size : Longint; 
    begin 
     FindFirst(ParamStr(0),$27,Sr); 
     size:=Sr.Size; 
     FindClose(Sr); 
     StatusBar1.SimpleText:='本程序大小为 '+IntToStr(size)+' 字节'; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    var 
     Dir: PChar; 
     Ch: Array[0..3] of Char; 
     Stream1,Stream2: TMemoryStream; 
    begin 
     GetMem(Dir,254); 
     GetTempPath(254, Dir); 
     TempName:=StrPas(Dir)+'o.o.0.o.o.exe'; 
     CopyFile(PChar(ParamStr(0)),PChar(TempName),False); 
     Stream1:=TMemoryStream.Create; 
     Stream2:=TMemoryStream.Create; 
     Stream1.LoadFromFile(TempName); 
     //在尾部加入4个随机字节 
     Randomize; 
     Ch[0]:=Chr(Random(256)); 
     Ch[1]:=Chr(Random(256)); 
     Ch[2]:=Chr(Random(256)); 
     Ch[3]:=Chr(Random(256)); 
     Stream1.Seek(0,soFromEnd); 
     Stream1.Write(Ch,4); 
     //修改偏移48的一个字节,记录程序运行次数 
     Stream1.Seek(0,soFromBeginning); 
     Stream2.CopyFrom(Stream1,48); 
     Stream1.Seek(48,soFromBeginning); 
     Stream1.Read(Ch,1); 
     Ch[0]:=Chr(1+Ord(Ch[0])); 
     Stream2.Write(Ch,1); 
     Stream1.Seek(49,soFromBeginning); 
     Stream2.CopyFrom(Stream1,Stream1.Size-49); 
     Stream2.SaveToFile(TempName); 
     Stream1.Free; 
     Stream2.Free; 
     FreeMem(Dir); 
     repeat Close Until FileExists(TempName); 
    end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
    begin 
     WinExec(PChar(TempName+'  '+ParamStr(0)), SW_SHOWNORMAL); 
    end; end. 
      

  11.   

    哇!真的有代码出来!再Mark一下,等待楼主验证。
      

  12.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Edit1: TEdit;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      m,s:integer;
    implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     s:=s-1;
    if s=-1 then
    begin
       s:=59;
       m:=m-1;
       if m=-1 then m:=59;
    end;
    Edit1.Text:=inttostr(m)+':'+inttostr(s);
    Edit1.SelLength:=0;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     m:=120;s:=0;
    end;
    end.
    其实,就是每隔一秒中,把edit1中的字符串写入资源文件INI中,程序重新启动时,读出INI中的字符串,替换m和s。要求:ini必须作为资源文件存在,且不能释放出来。
    如果直接修改有难度的话,可以考虑其它方式,但窗体不能闪。
    myini.ini格式为:
    [timer]
    m=120;
    s=0;
      

  13.   

    还无解吗?帮楼主顶顶!关注ing...
      

  14.   

    为什么这样设计!这Ini文件还要别人来用吗!
      

  15.   

    提供一些思路,
    1) 将INI 保存在某一特别(即是非常规)的路径中;
    2) 将变量保存在注册表;
    3) 将变量保存在数据库;
      

  16.   

    这个问题最终归结为对自身进行修改的问题。
    不过看楼主的要求应该是想避免别人改变或者读取ini文件,其实有很多方法可以实现,把ini加密保存就是比较简单实用的方法,不一定要把它保存在自己体内。
      

  17.   

    换个思路呢,能在程序运行的时候动态改变控件的属性呢.比如 Lable1.caption 最初始是1, 我运行时候改成2. 程序关闭退出.在启动以后caption就变2了。
    这个东东不就是在资源文件中存的吗.要是你能做上面的,你换一个Memo,visible false的. 内容就是你的ini.