求救用流合并文件的问题???(200)

  • 主题发起人 主题发起人 qbtxx
  • 开始时间 开始时间
Q

qbtxx

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码是用把流打操作的方式把Avi视频文件合并到一个EXE文件里的程序代码,其实也是别人的代码我改了一下~可不知为什么Avi合并不进EXE里?生成不了带有AVI文件的EXE!AVI写不进被指定的EXE里?不知问题出在那儿?前面几次有错误提示为[Unsafe fype 'pchar']意思好像是说变量问题吧,现什么都不指示了!有那位高手能帮我看一下,改改到底问题出在那儿???真急~代码如下:--------------------------------------------------------------------------------unit GoA1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;const DirPath = 'c:/program files/';type TForm1 = class(TForm) Button1: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private { Private declarations } function ExtractRes(ResType, ResName, ResNewName: String): Boolean;
//生成exe文件 function AddToFile(SourceFile, TargetFile: String): Boolean;
procedure AddMusicFile(var filename: String);
function MyFileSize(s: String):integer;//返回文件的字节大小 Procedure AddMusic;
Procedure WriteStringList;
Procedure MyShowMessage(s: String);
public { Public declarations } end;
var Form1: TForm1;
MyAvikFile: String;
MyStringList: TStringList;implementation{$R *.dfm}{$R myexe.res} //EXE资源文件procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
MyAvikFile := OpenDialog1.FileName;
if MyAvikFile = '' then
begin
MyShowMessage('请选择AVI文件!');
Exit;
end;

Label1.Caption:='avi:'+ MyAvikFile;
end;
procedure TForm1.Button2Click(Sender: TObject);//AVI合并到EXE中 var s: String;
exeFileName: String;
begin
s := '';
exeFileName := '';
if MyAvikFile = '' then
s := '缺少AVI文件!';
if SaveDialog1.Execute then
exeFileName := SaveDialog1.FileName;
if exeFileName = '' then
s := '请您填写保存文件名!';
if s <> '' then
begin
MyShowMessage(s);
exit;
end;

AddMusic;//生成所有文件exe s := DirPath + 'Eorx.exe';
copyfile(pchar(s),pchar(exeFileName + '.exe'), false);
//复制此执行文件 DeleteFile(Pchar(s));
MyShowMessage(AVI合并到EXE尾部成功!');
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyStringList := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyStringList.Free;
end;
function TForm1.AddToFile(SourceFile, TargetFile: String): Boolean;var Source,Target: TFileStream;
begin
try Source := TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
Target := TFileStream.Create(TargetFile,fmOpenWrite or fmShareDenyNone);
Target.Seek(0,soFromEnd);
Target.CopyFrom(Source,0);
//加文件加入目标文件中 Source.Free;
Target.Free;
except result := false;
exit;
end;

result := true;
end;
procedure TForm1.AddMusicFile(var filename: String);var Source: TFileStream;
Stream: TMemoryStream;
Myfilesize: integer;//stringlist的大小 begin
AddToFile(MyAvikFile, filename);
Source := TfileStream.Create(filename,fmOpenReadWrite or fmShareDenyNone);
Stream := TMemoryStream.Create;
MyStringList.SaveToStream(Stream);//将Mystringlist中的内容加入到memorystream流中 Source.Seek(0,soFromEnd );
Source.CopyFrom(Stream,0);//向已把stringlist中的内容全部复制到目标文件中 Myfilesize := Stream.Size + sizeof(Myfilesize);
Source.WriteBuffer(Myfilesize,sizeof(Myfilesize));//将MyStringList的大小写入它占的四个字节的整型中 Source.Free;
Stream.Free;
end;
function TForm1.MyFileSize(s: String): integer;var MyFileStream: TFileStream;
begin
MyFileStream := TFileStream.Create(s,fmOpenRead or fmShareDenyNone);
result := MyFileStream.Size;
MyFileStream.Free;
end;
procedure TForm1.MyShowMessage(s: String);
begin
Application.MessageBox(Pchar(s), '友好提示', MB_OK + MB_ICONWARNING);
end;
-------------------------------------------------------------------------------
 
这样肯定是不行的前面你把AVI添加到EXE的后面,然后你读的时候又想用资源的方式读?读的时候也是直接从EXE的后面读才对。
 
晕死·~To xianjun 老兄啊你到底有没有看清楚我说的话和如上的代码啊???如上的代码还没能做到AVI添加到EXE里呢~代码有错误的!请仔细看看好~
 
那就是两个问题一、合并就是把AVI直接添加到EXE的后面,然后写上添加的文件大小以便读取时候用。如果这个不成功,那就调试这部分代码。就是两个Stream拼起来,然后保存一下,没有什么特别的。二、读取的时候不能用TResourceStream读这种方式合并的文件,只能自己用FileStream读。TResourceStream只能读你加到资源中的文件,即用这种方式加的:{$R myexe.res} //EXE资源文件
 
你那个出错好像是读取的时候用的,和你的保存没什么关系,你先把出错的代码注释掉,然后执行看看,也就是先调试保存AVI到EXE文件后面的代码,是否成功或有误,问题要一个一个解决而且要分清楚。
 
问题已解决~谢谢两位·~
 
晕啊~不知是我的DEPHI编程器有问题还是。。。~两位兄弟有邮箱吗?
 

Similar threads

I
回复
0
查看
686
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部