代码如下:procedure OutRes(ResName:pChar;ResType:pChar;FileName:pChar);
//参数说明:
//ResName为资源文件里的名称
//ResType为资源文件里的类型名
//FileName为释放资源文件的路径
var
hResInfo:HRSRC;
hResData:HGLOBAL;
dwSize,dwWritten:DWORD;
hFile:THANDLE;
//dwBuf:array[1..65535] of char;
dwBuf:Pointer;
begin
hResInfo := FindResource(0 ,ResName,ResType);
if (hResInfo <> 0) then
begin
dwSize := SizeofResource(0,hResInfo);
hResData:= LoadResource(0,hResinfo);
if(hResData <> 0) then
begin
hFile := CreateFile(FileName,GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0 );
if(hFile <> 0) then
begin
dwBuf:=LockResource(hResData); //锁资源
if(WriteFile(hFile,dwBuf,dwSize,dwWritten,nil)) then
CloseHandle(hFile);
end;
end;
FreeResource(hResData);
end;
end; 这段代码是利用API进行资源文件的释放的,由于要控制文件的大小,所以不能使用Delphi提供的TResourceStream方法,该方法必须引用Classes单元,这样会使程序扩大好几百K,很不可取。资源释放其实完全可以依靠API实现,而经我分析,TResourceStream方法也基本上是适用以上的思路实现的,只不过它用一些方法封装了一些细节,使之使用更加方便了而已。 这段代码从思路上来说完全没有问题,并且据我测试,FindResource能够找到资源句柄,SizeofResource返回的资源大小完全正确,LoadResource也能够正确读取并返回,CreateFile的执行也是成功的,LockResource也能够返回一个不为空的指针,问题似乎就在于最后的这个WriteFile上,但困扰我的地方就是在这,我实在是找不出问题到底是出在哪里了,最终释放出来的文件是一个0字节大小的文件。这到底是怎么回事呢?请诸位大哥们帮帮我,这个问题我已经折腾了一个多星期了,实在是没辙了。我谢谢你们了。
//参数说明:
//ResName为资源文件里的名称
//ResType为资源文件里的类型名
//FileName为释放资源文件的路径
var
hResInfo:HRSRC;
hResData:HGLOBAL;
dwSize,dwWritten:DWORD;
hFile:THANDLE;
//dwBuf:array[1..65535] of char;
dwBuf:Pointer;
begin
hResInfo := FindResource(0 ,ResName,ResType);
if (hResInfo <> 0) then
begin
dwSize := SizeofResource(0,hResInfo);
hResData:= LoadResource(0,hResinfo);
if(hResData <> 0) then
begin
hFile := CreateFile(FileName,GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0 );
if(hFile <> 0) then
begin
dwBuf:=LockResource(hResData); //锁资源
if(WriteFile(hFile,dwBuf,dwSize,dwWritten,nil)) then
CloseHandle(hFile);
end;
end;
FreeResource(hResData);
end;
end; 这段代码是利用API进行资源文件的释放的,由于要控制文件的大小,所以不能使用Delphi提供的TResourceStream方法,该方法必须引用Classes单元,这样会使程序扩大好几百K,很不可取。资源释放其实完全可以依靠API实现,而经我分析,TResourceStream方法也基本上是适用以上的思路实现的,只不过它用一些方法封装了一些细节,使之使用更加方便了而已。 这段代码从思路上来说完全没有问题,并且据我测试,FindResource能够找到资源句柄,SizeofResource返回的资源大小完全正确,LoadResource也能够正确读取并返回,CreateFile的执行也是成功的,LockResource也能够返回一个不为空的指针,问题似乎就在于最后的这个WriteFile上,但困扰我的地方就是在这,我实在是找不出问题到底是出在哪里了,最终释放出来的文件是一个0字节大小的文件。这到底是怎么回事呢?请诸位大哥们帮帮我,这个问题我已经折腾了一个多星期了,实在是没辙了。我谢谢你们了。
解决方案 »
- 改造dxflowchart 控件
- chart上画移动平均线问题
- capability not support!如何解决这个错误啊?
- 奇怪的问题:类里面的成员数组调用
- Application.MessageBox('真的中止吗?','警告',MB_OKCANCEL) 弹出来的时候能不能让缺省选中取消啊?
- 关于PARDOX数据库问题?
- (Runtime Library ,RTL)运行库
- 真是的,怎么回事?我一运行就这样
- Delphi专区的各位高手,在解决各自难题的同时,可否拉小弟一把,好让我也加入Delphi大家庭!
- 初级的学生请教各位老师! 这个程序怎么写?
- 如何将BarCodeCtrl存储为*.bmp图片
- 使用glscene控件的一个问题,bug?
procedure ExtractRes(ResType, ResName, ResNewName: string);
// TODO -cMM: ExtractRes 释放资源
var
HResInfo: THandle;
HGlobal: THandle;
FMemory: Pointer;
FSize: Longint;
handle: THandle;
Wsize: longword;
procedure SetPointer(Ptr: Pointer; Size: Longint);
begin
FMemory := Ptr;
FSize := Size;
end;
function Initialize(Instance: THandle; Name, ResType: PChar): boolean;
begin
result := false;
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Exit;
HGlobal := LoadResource(Instance, HResInfo);
if HGlobal = 0 then Exit;
SetPointer(LockResource(HGlobal), SizeOfResource(Instance, HResInfo));
result := true;
end;
begin
if not Initialize(hInstance, PChar(ResName), PChar(ResType)) then exit;
if fileexists(ResNewName) then Deletefile(pchar(ResNewName));
try
handle := Integer(CreateFile(PChar(ResNewName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
WriteFile(Handle, FMemory^, FSize, Wsize, nil);
CloseHandle(handle);
except
end;
UnlockResource(HGlobal);
FreeResource(HGlobal);
end;