因该提示一个地址访问错误吧,你所使用的动态数组在进行分配时没有足够的内存空间来存放从文件读取的内容。你试试将动态数据的分配空间加大。可以解决这个问题。   
setlength(buffer,256);

解决方案 »

  1.   

    reg.WriteBinaryData('test',buffer^,newfile.size);
    buffer处加了一个 ^ 符号. 
      

  2.   

    第一段代码:buffer根本没有赋予内存空间自然会出错
    第三段代码:buffer是pchar类,过程结束后自动释放,freemem(buffer)来释放一个指针变量当然会出错,因改为freemem(buffer,tempfile.size)
      

  3.   

    多谢Avenir,我有点儿思路了。关于第一段的代码。
    我调试了一下,
    procedure TForm1.Button1Click(Sender: TObject);
    var existedFile:string;
        buffer:array of char;
        reg:TRegistry;
        newfile:TFileStream;
    begin
            if edit1.Text[length(edit1.text)]='\'
            then
              existedFile:=edit1.text+'New Oriental Words.cfg'
            else
              existedFile:=edit1.text+'\New Oriental Words.cfg';      newfile:=TFileStream.Create(existedFile,fmOpenRead);      reg:=TRegistry.Create;
          reg.RootKey:=HKEY_CURRENT_USER;
          try
            if  reg.OpenKey('Software\J-Studio',true)
            then
            begin
              setlength(buffer,newfile.size);//setlength 后buffer的地址是@buffer $12F56C,@buffer[0]为 $CB3960
                                             //而buffer的内容是为$CB3960,
              newfile.ReadBuffer(buffer,newfile.size);//read后@buffer[0]为 $FFFFFFFE ,@buffer不变,还为$12F56C
                                                      //我看了我用的文件,刚好开头的数据为FEFFFFFF
                                                     //buffer的内容也变为了$FFFFFFFE
              reg.WriteBinaryData('test',buffer,newfile.size);
            end;
          finally
            reg.free;
            newfile.free;             //出错。
          end;
    end;我本认为原因是这样的。
    动态数组和静态数组不一样,当调用setlength后,buffer是指向一段的内存空间,所以buffer和buffer[0]的内容与地址都是不一样的(这点应该是对的)。当调用newfile.readbuffer时,readbuffer开始向地址为@buffer的内存写入(我想应该也对)。于是就把newfile的内容给覆盖了。于是调用newfile.free就会出错。(这个应该错了)后来我又仔细看了看,我发现newfile和reg内存所存的指针都没有变化,也就是说它们被没有被覆盖。也就是说reg.free和newfile.free并没有错。程序提示出错应该是隐含自动释放动态数组出错(出错信息为
    Project launcher.exe raised exception class EAccessViolation with message 'Accessviolation at address 00404B6C in module 'launcher.exe'. Read of address FFFFFFF6'. Process stopped. Use Step or Run to continue.)   出错信息里的read of address FFFFFFF6应该就是因为我把buffer的内容变为了$FFFFFFFE。我上边的解释所存在的问题如下:
    1.如果newfile.readbuffer往地址为@buffer的内存单元写东西,它一定会把reg和newfile内存里的指针覆盖的,reg.free,newfile.free应该都会出错,但是实际却没有,难道程序会自动保护这些单元,使它们不可写吗?如果是这样的话,当执行readbuffer时就应该会出错了。
    可以并没有报错,文件写进注册表也没有一点儿问题,都正确。
      

  4.   

    多谢Avenir,我有点儿思路了。关于第一段的代码。
    我调试了一下,
    procedure TForm1.Button1Click(Sender: TObject);
    var existedFile:string;
        buffer:array of char;
        reg:TRegistry;
        newfile:TFileStream;
    begin
            if edit1.Text[length(edit1.text)]='\'
            then
              existedFile:=edit1.text+'New Oriental Words.cfg'
            else
              existedFile:=edit1.text+'\New Oriental Words.cfg';      newfile:=TFileStream.Create(existedFile,fmOpenRead);      reg:=TRegistry.Create;
          reg.RootKey:=HKEY_CURRENT_USER;
          try
            if  reg.OpenKey('Software\J-Studio',true)
            then
            begin
              setlength(buffer,newfile.size);//setlength 后buffer的地址是@buffer $12F56C,@buffer[0]为 $CB3960
                                             //而buffer的内容是为$CB3960,
              newfile.ReadBuffer(buffer,newfile.size);//read后@buffer[0]为 $FFFFFFFE ,@buffer不变,还为$12F56C
                                                      //我看了我用的文件,刚好开头的数据为FEFFFFFF
                                                     //buffer的内容也变为了$FFFFFFFE
              reg.WriteBinaryData('test',buffer,newfile.size);
            end;
          finally
            reg.free;
            newfile.free;             //出错。
          end;
    end;我本认为原因是这样的。
    动态数组和静态数组不一样,当调用setlength后,buffer是指向一段的内存空间,所以buffer和buffer[0]的内容与地址都是不一样的(这点应该是对的)。当调用newfile.readbuffer时,readbuffer开始向地址为@buffer的内存写入(我想应该也对)。于是就把newfile的内容给覆盖了。于是调用newfile.free就会出错。(这个应该错了)后来我又仔细看了看,我发现newfile和reg内存所存的指针都没有变化,也就是说它们被没有被覆盖。也就是说reg.free和newfile.free并没有错。程序提示出错应该是隐含自动释放动态数组出错(出错信息为
    Project launcher.exe raised exception class EAccessViolation with message 'Accessviolation at address 00404B6C in module 'launcher.exe'. Read of address FFFFFFF6'. Process stopped. Use Step or Run to continue.)   出错信息里的read of address FFFFFFF6应该就是因为我把buffer的内容变为了$FFFFFFFE。我上边的解释所存在的问题如下:
    1.如果newfile.readbuffer往地址为@buffer的内存单元写东西,它一定会把reg和newfile内存里的指针覆盖的,reg.free,newfile.free应该都会出错,但是实际却没有,难道程序会自动保护这些单元,使它们不可写吗?如果是这样的话,当执行readbuffer时就应该会出错了。
    可以并没有报错,文件写进注册表也没有一点儿问题,都正确。