想将一个文件压入另一个EXE文件中,再压入个密码
可是下面的获取密码函数不能提取出用下面的合并函数合并的文件
获取密码时弹出的对话框:
Passwordsize:4376592(没这么大哦)
True
密码错误,密码是:(没有获得密码)
********合并*********
Function AddtoFile(SourceFile,PassWord,TargetFile:String):Boolean;
 Var
  Target,Source:TFileStream;
  MyFileSize,PassWordSize: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));
    PassWordSize:=Sizeof(PassWord)+sizeof(PassWordSize);
    Target.Seek(0,soFromEnd);
    Target.WriteBuffer(PassWord,Sizeof(PassWord));
    Target.WriteBuffer(PassWordSize,sizeof(PassWordSize));
   Finally
    Target.Free;
    Source.Free;
   End;
   Except
    Result:=False;
    Exit;
   End;
  Result:=True;
  End;           
***********获取密码**********
Function PassFromFile(var password:string;SourceFile:string):Boolean;
 Var
  Source:TFileStream;
  PassWordSize:integer;
 Begin
  Try
   Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
  Try
   Source.Seek(0,soFromEnd);{定位到资源位置}
   Source.Read(PassWordSize,Sizeof(PassWordSize));
   showmessage('PassWordSize:'+inttostr(PassWordSize));
   Source.Seek(-PassWordSize,soFromEnd);
   Source.Read(PassWord,PassWordSize-Sizeof(PassWordSize));
  Finally
   Source.Free;
  End;
  Except
  showmessage('false');
   Result:=false;
  Exit;
 End;
 showmessage('true');
  Result:=true;
 End;

解决方案 »

  1.   

    Source.Seek(0,soFromEnd);{定位到资源位置}//这儿不对吧
      

  2.   

    改完了还有问题,密码还没判断了就出现:存取地址*****违例发生在模块***...怎么回事哦
    3个函数都贴出来
    Function AddtoFile(SourceFile,PassWord,TargetFile:String):Boolean;
     Var
      Target,Source:TFileStream;
      MyFileSize,PassWordSize: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));
        PassWordSize:=Sizeof(PassWord)+sizeof(PassWordSize);
        Target.Seek(0,soFromEnd);
        Target.WriteBuffer(PassWord,Sizeof(PassWord));
        Target.WriteBuffer(PassWordSize,sizeof(PassWordSize));
       Finally
        Target.Free;
        Source.Free;
       End;
       Except
        Result:=False;
        Exit;
       End;
      Result:=True;
      End;          
    **********************
    Function PassFromFile(var password:string;SourceFile:string):Boolean;
     Var
      Source:TFileStream;
      PassWordSize:integer;
     Begin
      Try
       Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
      Try
       Source.Seek(-sizeof(passwordsize),soFromEnd);{定位到资源位置}
       Source.Read(PassWordSize,Sizeof(PassWordSize));
       Source.Seek(-PassWordSize,soFromEnd);
       Source.Read(PassWord,PassWordSize-Sizeof(PassWordSize));
      Finally
       Source.Free;
      End;
      Except
       Result:=false;
      Exit;
     End;
      Result:=true;
     End;
    ********************************************
    Function LoadFromFile(SourceFile,TargetFile :string):Boolean;
    var
    Source:TFileStream;
    Target:TMemoryStream;
    MyFileSize,Passsize:integer;
    pass:string;
    begin
    try
    Target:=TMemoryStream.Create;
    Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
    try
    Source.Seek(-sizeof(Passsize),soFromEnd);{定位到资源位置}
    Source.Read(PassSize,Sizeof(Passsize));
    Source.Seek(-sizeof(MyFileSize)-PassSize,soFromEnd);
    Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
    Source.Seek(-MyFileSize-PassSize-sizeof(MyFileSize),soFromEnd);//定位到资源位置
    showmessage('afsdf');
    Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
    Target.SaveToFile(TargetFile);//存放到文件
    finally
    Target.Free;
    Source.Free;
    end;
    except
    Result:=false;
    Exit;
    end;
    Result:=true;
    end;
      

  3.   

    Target.WriteBuffer(PassWord,Sizeof(PassWord));这儿也有问题:
    string是从1开始下标的,SizeOf一个string总是4,要用Length来测算长度Target.WriteBuffer(PassWord[1],Length(password));
      

  4.   

    SetLength(password, 100);//要先设置string 的大小 
    Target.WriteBuffer(PassWord[1],Length(password));
      

  5.   

    昨天我自己检查出来几个错误,再加上楼上的提出的错误,可是改完了还是不行,运行时弹出对话框(密码错误,密码是:)还是没有获得密码。
    改完的代码:(望高手细看,小弟不胜感激!)
    **********结构********
    head:用于释放的程序
    sourse:被添加的文件
    sosize:被添加的文件和自身的大小
    password:密码
    passsize:密码和自身的大小**********合并文件*************
    Function AddtoFile(SourceFile,PassWord,TargetFile:String):Boolean;
     Var
      Target,Source:TFileStream;
      MyFileSize,PassWordSize: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));
        PassWordSize:=Length(PassWord)+sizeof(PassWordSize);
        Target.Seek(0,soFromEnd);
        SetLength(password, 100);//要先设置string 的大小
        Target.WriteBuffer(PassWord[1],Length(password));
        Target.WriteBuffer(PassWordSize,sizeof(PassWordSize));
       Finally
        Target.Free;
        Source.Free;
       End;
       Except
        Result:=False;
        Exit;
       End;
      Result:=True;
      End;       
    ************获取密码************
    Function PassFromFile(var password:string;SourceFile:string):Boolean;
     Var
      Source:TFileStream;
      PassWordSize:integer;
     Begin
      Try
       Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
      Try
       Source.Seek(-sizeof(passwordsize),soFromEnd);{定位到资源位置}
       Source.Read(PassWordSize,Sizeof(PassWordSize));
       Source.Seek(-PassWordSize,soFromEnd);
       Source.Read(PassWord,PassWordSize-Sizeof(PassWordSize));
      Finally
       Source.Free;
      End;
      Except
       Result:=false;
      Exit;
     End;
      Result:=true;
     End;
    **********分离文件************
    Function LoadFromFile(SourceFile,TargetFile :string):Boolean;
    var
    Source:TFileStream;
    Target:TMemoryStream;
    MyFileSize,Passsize:integer;
    pass:string;
    begin
    try
    Target:=TMemoryStream.Create;
    Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
    try
    Source.Seek(-sizeof(Passsize),soFromEnd);{定位到资源位置}
    Source.Read(PassSize,Sizeof(Passsize));
    Source.Seek(-sizeof(MyFileSize)-PassSize,soFromEnd);
    Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
    Source.Seek(-MyFileSize-PassSize,soFromEnd);//定位到资源位置
    Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
    Target.SaveToFile(TargetFile);//存放到文件
    finally
    Target.Free;
    Source.Free;
    end;
    except
    Result:=false;
    Exit;
    end;
    Result:=true;
    end;
      

  6.   

    http://www.2ccc.com/article.asp?articleid=3444
    ////////
    这有流的详细教程及应用,...
      

  7.   

    {**********结构********
    head:用于释放的程序
    sourse:被添加的文件
    sosize:被添加的文件和自身的大小
    password:密码
    passsize:密码和自身的大小}///**********合并文件*************
    Function AddtoFile(SourceFile,PassWord,TargetFile:String):Boolean;
     Var
      Target,Source:TFileStream;
      MyFileSize,PassWordSize: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));
        PassWordSize:=Length(PassWord)+sizeof(PassWordSize);
        Target.Seek(0,soFromEnd);
        //SetLength(password, 100);//读字符串就不要设置大小了
        Target.WriteBuffer(PassWord[1],Length(password));
        Target.WriteBuffer(PassWordSize,sizeof(PassWordSize));
       Finally
        Target.Free;
        Source.Free;
       End;
       Except
        Result:=False;
        Exit;
       End;
      Result:=True;
      End;       
    //************获取密码************
    Function PassFromFile(var password:string;SourceFile:string):Boolean;
     Var
      Source:TFileStream;
      PassWordSize:integer;
     Begin
      Try
       Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
      Try
       Source.Seek(-sizeof(passwordsize),soFromEnd);{定位到资源位置}
       Source.Read(PassWordSize,Sizeof(PassWordSize));
       Source.Seek(-PassWordSize,soFromEnd);
       SetLength(password, PassWordSize-Sizeof(PassWordSize));///写字符串要先设置string 的大小
       Source.Read(PassWord[1],PassWordSize-Sizeof(PassWordSize));
      Finally
       Source.Free;
      End;
      Except
       Result:=false;
      Exit;
     End;
      Result:=true;
     End;
    //**********分离文件************
    Function LoadFromFile(SourceFile,TargetFile :string):Boolean;
    var
    Source:TFileStream;
    Target:TMemoryStream;
    MyFileSize,Passsize:integer;
    pass:string;
    begin
    try
    Target:=TMemoryStream.Create;
    Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
    try
    Source.Seek(-sizeof(Passsize),soFromEnd);{定位到资源位置}
    Source.Read(PassSize,Sizeof(Passsize));
    Source.Seek(-sizeof(MyFileSize)-PassSize,soFromEnd);
    Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
    Source.Seek(-MyFileSize-PassSize,soFromEnd);//定位到资源位置
    Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
    Target.SaveToFile(TargetFile);//存放到文件
    finally
    Target.Free;
    Source.Free;
    end;
    except
    Result:=false;
    Exit;
    end;
    Result:=true;
    end;
      

  8.   

    谢谢哦,postren的代码可以了,我自己研究研究