通常在Delphi的应用程序中,我们会调用到很多的资源,例如图片,动画(AVI),声音,甚至于别的执行文件。当然,把这些资源分布到不同的目录不失为一个好办法,但是有没有可能把这些资源编译成标准的windows资源从而链接到一个执行文件里面呢? 我们可以自己做一个RC文件,例如 sample.rc ,RC文件其实就是一个资源文件的描述文本,通过“记事本”程序创建就行了。然后可以输入一些我们要定义的资源,例如:MEN BITMAP c:\bitmap\men.bitmap
ARJ EXEFILE c:\arj.exe
MOV AVI c:\mov.avi
然后用BRCC32把这个RC文件编译成sample.res(真正的资源文件)。在Delphi的工程文件中使用 $R 编译指令让Delphi包括资源到EXE文件里面。{$R sample.res}
这样我们就可以在这个单一的执行文件中调用资源了。举例如下:EXEFILE:procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName);
Res.Free;
end;
AVI:procedure LoadAVI;
begin
{Avi1是一个TAnimate类}
Avi1.ResName:='AVI';
Avi1.Active:=True;
end;
ARJ EXEFILE c:\arj.exe
MOV AVI c:\mov.avi
然后用BRCC32把这个RC文件编译成sample.res(真正的资源文件)。在Delphi的工程文件中使用 $R 编译指令让Delphi包括资源到EXE文件里面。{$R sample.res}
这样我们就可以在这个单一的执行文件中调用资源了。举例如下:EXEFILE:procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName);
Res.Free;
end;
AVI:procedure LoadAVI;
begin
{Avi1是一个TAnimate类}
Avi1.ResName:='AVI';
Avi1.Active:=True;
end;
那要怎么定义?avi是avi的,我总不能乱取个定义名吧,再说了,又bcc不过
C:\aaaa.htm
c:\aaaa.files\a1.gif
c:\aaaa.files\a2.gif新建立文本文件a.txt,内容如下:
aaaa exefile c:\aaaa.htm
a1 exefile c:\aaaa.files\a1
a2 exefile c:\aaaa.files\a2保存并重命名为a.rc在命令提示符下执行:
c:\>brcc32 c:\a.rc生成资源文件a.res
(brcc32.exe 在delphi的安装目录下的bin下)
在程序中的操作类同上帖中对exe文件的处理。
Error E2206 c:\loading.rc 1: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 1: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 1: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 2: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
Error E2206 c:\loading.rc 3: Illegal character '\' (0x5c)
看吧
HTMLTEST RT_RCDATA Test.htm编译连接到exe中之后,用TResourceStream读取并写入磁盘文件。
TestHTML RT_RCDATA test.htm然后在命令行运行
brcc32 test.rc
这样就得到 test.res然后在你的form中
implementation
{$R *.DFM}
{$R about.res}就是添加上面最后一行,这样资源就编译进exe了。然后在需要的地方编个过程,类似这样
var
resTest:TResourceStream;
strFileName,strDir,strFullName:string;
pchTempName,pchTemp:array[0..255] of char;
nSize:integer;
begin
strDir:=ExtractFileDir(Application.ExeName);
strFileName:='test.htm';
strFullName:=strDir+'\'+strFileName;
restest:=TResourceStream.Create(hInstance,'TestHTML','RT_RCDATA');
try
resTest.SaveToFile(strFullName);
except
pchTempName:='Temp';
nSize:=255;
GetEnvironmentVariable(pchTempName,pchTemp,nSize);
strDir:=string(pchTemp);
strFullName:=strDir+'\'+strFileName;
resTest.SaveToFile(strFullName);
end;
resTest.Free;
end;
这样test.htm就动态创建在当前目录或临时目录下了,想怎么用都可以。
用完了可以删除,反正以后还可以创建。
{$R test.res}
反正就是你编译出来的资源res的文件名