如何向自身程序写入数据??????????????????????//急!!!!!
例如改变量的值
例如type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;  const
  id='ddf';var
  Form1: TForm1;implementation{$R *.dfm}....
....
上面定义了id的变量,请问运行时如何向自身程序写入数据改变这个变量的值 ??????
例如将 id 改成 'hhh'就是在 运行的 exe文件写入数据!

解决方案 »

  1.   


      const
      id='ddf';
      id 声明的是常量,无法修改,变量声明如下var
      Form1: TForm1;
      id :string;implementation{$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    id :='ddf'
    end;;
      

  2.   

    你到www.delphibox.com去下载个控件试试。
      

  3.   

    搞不清想问什么,如果是想记录一些参数,用INI和注册表呀。
      

  4.   

    你们这都不明白?
    他应该是要保存一些重要的信息,在注册表或INI都不够安全的情况下,写入自身或许是最安全的。
      

  5.   

    写肯定是可以写的,就向病毒那样做,不过我不会,csdn好像有windows的.exe文件(好像是叫PE格式吧)格式的资料
      

  6.   

    我知道他的意思啦,就象定义好一个LABLE1。CAPTION:=‘ABC’,但是我以后可能想改成ACC,但要求改好后,就纪录到程序中,下次打开还是ACC,而不是ABC。我说的对吧,哪位兄弟可以解决这个问题。
      

  7.   

    //hnhb(不死鸟) ;写到注册表,客户他就知道了???//
    大哥,这个好像有点...嘿嘿。
    自身修改可执行文件可不简单。
    不过我赞成你的方法,客户有时候懂一点@#%^&#*  是很可怕的。
      

  8.   

    我的建议:
    将ID定义成常量,然后赋一个特定值(如'AAAAA'),编译成EXE文件后
    通过二进制编辑工具;查找'AAAAA'、修改其内容如'ABCDE',存盘后
    运行EXE文件,此时的ID值即是'ABCDE'
      

  9.   

    搞完这个,你用DELPHI就可以写病毒了。
      

  10.   

    我觉得他的意思是像java的类变量那样,
    即任何一个对象实体可以对此变量进行改变,不过我不知道怎么实现
    JAVA里只要有个static就可以了,delphi不知道
      

  11.   


    我在delphi超级猛料中看过一篇文章叫 运行时刻修改字符串资源
    看看,或许有用,不过我一直都看不懂
      

  12.   

    ReSourceString
      IdStr = 'ddf';
      

  13.   

    1。Resourcestring表示资源字符串,如果你要修改它,可以修改程序资源
    2。局部常量可以修改,全局常量8可以修改
      

  14.   

    还有:使用{$J+}时可以改值;D默认为{$J-},不可修改
      

  15.   

    还是好好学学Delphi吧
    type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;  const
      {$J+}//add writable const switch
      id='ddf';
      {$J-}//add unwritable const switch 
    var
      Form1: TForm1;implementation{$R *.dfm}....
    ....
      

  16.   

    但不能在程序中任何地方修改!!! 不能达到我的要求!下面编译时出错! procedure TForm1.FormCreate(Sender: TObject);
    begin
      {$J+}//add writable const switch
      id:='aa';
      {$J-}//add unwritable const switchend;
      

  17.   

    我曾经遇见过一个运行中加入的问题listbox.items.add(self,'i love you');
      

  18.   

    type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;const//定义常量时加才有用!
      {$J+}//add writable const switch!!!
      id: string='ddf';
      {$J-}//add unwritable const switch 
    var
      Form1: TForm1;implementationprocedure TForm1.FormCreate(Sender: TObject);
    begin
      id:='aa';
    end;
      

  19.   

    我试过下代码, 蒋id:='aa'后, 下次打开程序时edit1不是'aa' 依然是'ddf'!!
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
       const//定义常量时加才有用!
      {$J+}//add writable const switch!!!
      id: string='ddf';
      {$J-}//add unwritable const switch 
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
        edit1.Text:=id;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
     id:='aa';
    end;end.
      

  20.   

    我想其实可以做一些变通,将您的变量的值保存在DATABASE,TXT,DLL中,他是动态存储的
    当你设定了它们之间的接口,不就可以了,最好是保存在DLL中
      

  21.   

    blazingfire(烈焰)(正在思考的流浪汉...) 
    说的不错
    是你写错了
    这句改成
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        edit1.Text:=id;——〉 id:='aa';
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
     id:='aa';——〉edit1.Text:=id
    end;
      

  22.   

    不要钻牛角尖了,
    “将您的变量的值保存在DATABASE,TXT,DLL中”吧。
      

  23.   

    下面的代码不知道对你有没有用。
    运行完毕后删除自己的程序     
      procedure DeleteSelf; 
    varmodule : HMODULE;buf : array[0..MAX_PATH - 1] of char;p : ULONG;hKrnl32 : HMODULE;pExitProcess, pDeleteFile, pFreeLibrary: pointer;beginmodule := GetModuleHandle(nil);GetModuleFileName(module, buf, sizeof(buf));CloseHandle(THandle(4));p := ULONG(module) + 1;hKrnl32 := GetModuleHandle('kernel32');pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');asmlea eax, bufpush 0push 0push eaxpush pExitProcesspush ppush pDeleteFilepush pFreeLibraryretend;end;把DeleteSelf代码放在DPR文件的最后一句即可,程序关闭之后,就会自动删除文件!此外,如果要任何时候都删除Exe的话,可以配合ExitProc&TerminateProc全局变量和AddExitProc&AddTerminateProc来做到这一点!!这个过程的优点在于不需要一个临时文件,保密程度和技术方面都比较强的。当然,你也可以利用一个临时的批处理文件来达到目的!procedure DeleteMe;varBatchFile: TextFile;BatchFileName: string;ProcessInfo: TProcessInformation;StartUpInfo: TStartupInfo;beginBatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';AssignFile(BatchFile, BatchFileName);Rewrite(BatchFile);Writeln(BatchFile, ':try');Writeln(BatchFile, 'del "' + ParamStr(0) + '"');Writeln(BatchFile,'if exist "' + ParamStr(0) + '"' + ' goto try');Writeln(BatchFile, 'del %0');CloseFile(BatchFile);FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;StartUpInfo.wShowWindow := SW_HIDE;if CreateProcess(nil, PChar(BatchFileName), nil, nil,False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,ProcessInfo) thenbeginCloseHandle(ProcessInfo.hThread);CloseHandle(ProcessInfo.hProcess);end;end;**************下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码.这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了.int main(int argc, char *argv[]){HMODULE module = GetModuleHandle(0);CHAR buf[MAX_PATH];GetModuleFileName(module, buf, sizeof buf);CloseHandle(HANDLE(4));__asm {lea eax, bufpush 0push 0push eaxpush ExitProcesspush modulepush DeleteFilepush UnmapViewOfFileret}return 0;}现在,我们先看一下堆栈中的东西偏移 内容24 020 016 offset buf12 address of ExitProcess8 module4 address of DeleteFile0 address of UnmapViewOfFile调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回.这段代码的精妙之处在于:1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄.2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码.3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)#include Windows.hint main(int argc, char *argv[]){HMODULE module = GetModuleHandle(0);CHAR buf[MAX_PATH];GetModuleFileName(module, buf, sizeof(buf));MessageBox(0,"Del Me","Test",MB_OK);CloseHandle((HANDLE)4);__asm {lea eax, bufpush 0push 0push eaxpush ExitProcesspush modulepush DeleteFilepush UnmapViewOfFileret}return 0;}采用vc++6.0的控制台模式编译运行该程序后自动把自己删掉
    //删除自己 可以在任何时候调用!Procedure DeleteSelf;
    var
      module            : HMODULE;
      buf               : array[0..MAX_PATH - 1] of char;
      p                 : ULONG;
      hKrnl32           : HMODULE;
      pExitProcess, pDeleteFile, pFreeLibrary: pointer;
    begin
      module := GetModuleHandle(nil);
      GetModuleFileName(module, buf, sizeof(buf));  CloseHandle(THandle(4));  p := ULONG(module) + 1;  hKrnl32 := GetModuleHandle('kernel32');
      pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
      pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
      pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');  asm
        lea eax, buf
        push 0
        push 0
        push eax
        push pExitProcess
        push p
        push pDeleteFile
        push pFreeLibrary
        ret
      end;
    end;
      

  24.   

    cooling(cooling)  你的程序太复杂,有简单点的吗?
      

  25.   

    blazingfire(烈焰)(正在思考的流浪汉...) 
    说的不错
      

  26.   

    qizhanfeng(glacier) 
    blazingfire(烈焰)(正在思考的流浪汉...) 
    说的不错
    是你写错了
    这句改成
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        edit1.Text:=id;——〉 id:='aa';
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
     id:='aa';——〉edit1.Text:=id
    end;
    ??好像不是这个意思吧
     
     
      

  27.   

    按你的程序写法我无法为你解决,但根据“向自身程序写入数据”这个要求我有折中的想法!
    就是res文件,你可以把重要信息存在res文件中,随时读写,就像ini文件一样方便,具体用法就不说了,到处都是,而且编译后不需res文件和exe文件一起发布因为res已经被编译进exe文件了。
    不知我的想法对不对,你可以试试,我是经常这样发布图片的
      

  28.   

    你定义的是一个常量不能改变
    但有几种方法可以使用:
    1.你把ID定义为变量,程序每次启动的时候你可以给他赋值,以后可以改变,但是每次程序重起的时候,变量有变回原来的值,
    2,也是定义为变量,但是你把他的值写到一个INI文件中去,程序每次都去读这个INI文件,就可以得到新的变量了,这个变量就可以看成是一个常量! 
      

  29.   

    我赞成 vargent77(地平线) 的说法。
      

  30.   

    请问' vargent77(地平线)' 能不能详细说说你的方法
      

  31.   

    我赞成 vargent77(地平线) ,WGYKING(【将要被封杀】)  的说法。
    你好好看一看使用帮助!
    多的很!