全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1517
推到 Plurk!
推到 Facebook!

请帮我找一下这段关于释放资源文件的代码存在的问题

答題得分者是:wameng
treachery
一般會員


發表:5
回覆:3
積分:1
註冊:2007-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-01 12:20:04 IP:61.138.xxx.xxx 訂閱
代码如下: 

[code delphi]
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;
[/code]

这段代码是利用API进行资源文件的释放的,由于要控制文件的大小,所以不能使用Delphi提供的TResourceStream方法,该方法必须引用Classes单元,这样会使程序扩大好几百K,很不可取。资源释放其实完全可以依靠API实现,而经我分析,TResourceStream方法也基本上是适用以上的思路实现的,只不过它用一些方法封装了一些细节,使之使用更加方便了而已。

这段代码从思路上来说完全没有问题,并且据我测试,FindResource能够找到资源句柄,SizeofResource返回的资源大小完全正确,LoadResource也能够正确读取并返回,CreateFile的执行也是成功的,LockResource也能够返回一个不为空的指针,问题似乎就在于最后的这个WriteFile上,但困扰我的地方就是在这,我实在是找不出问题到底是出在哪里了,最终释放出来的文件是一个0字节大小的文件。这到底是怎么回事呢?请诸位大哥们帮帮我,这个问题我已经折腾了一个多星期了,实在是没辙了。我谢谢你们了。
------
跳舞吧,如同没有任何人注视你一样;
唱歌吧,如同没有任何人聆听一样;
去爱吧,如同从来没有受过伤害一样;
工作吧,如同不需要金钱一样;
活着吧,如同今天是末日一样;
----艾佛烈德.德索萨
編輯記錄
treachery 重新編輯於 2007-10-01 12:21:15, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-01 12:56:05 IP:61.222.xxx.xxx 訂閱
折騰了一個多星期,眼睛夠大了。

if(WriteFile(hFile,dwBuf^,dwSize,dwWritten,nil)) then CloseHandle(hFile);
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-01 13:14:52 IP:210.66.xxx.xxx 訂閱
果然是版主,被早一步...


[code delphi]
procedure TForm1.OutRes(ResName, ResType, FileName: pChar);
var
hResInfo: HRSRC;
hResData: HGLOBAL;
dwSize, dwWritten: DWORD;
hFile: THANDLE;
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
try
hFile := CreateFile(FileName, GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
if hFile <> 0 then
try
dwBuf := LockResource(hResData);
if WriteFile(hFile, dwBuf^, dwSize, dwWritten, nil) then
begin
{Write File Success}
end;
finally
CloseHandle(hFile);
end;
finally
FreeResource(hResData);
end;
end;
end;
[/code]

編輯記錄
jow 重新編輯於 2007-10-01 13:16:22, 註解 無‧
treachery
一般會員


發表:5
回覆:3
積分:1
註冊:2007-10-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-01 16:09:41 IP:61.138.xxx.xxx 訂閱
天!我真的不知道该如何谢谢你,我问了那么多人,那么多社区,可是就是没有人能找出这个问题。
真诚的谢谢你,这个问题完美的解决了,现在的我用热泪盈眶来形容毫不夸张,因为解决这个问题对我来说非常重要。
为了表达我的谢意,我很乐意经常光顾贵论坛,看到我能够回答的问题就尽量详尽解答,作出我力所能及的贡献,以及经常把我的心得拿来在这里发表。再次的感谢!
------
跳舞吧,如同没有任何人注视你一样;
唱歌吧,如同没有任何人聆听一样;
去爱吧,如同从来没有受过伤害一样;
工作吧,如同不需要金钱一样;
活着吧,如同今天是末日一样;
----艾佛烈德.德索萨
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-01 17:04:51 IP:210.66.xxx.xxx 訂閱
提醒你注意 CloseHandle(hFile);  的位置,
即使WriteFile()沒有成功被執行,應該還是
要call CloseHandle(hFile);
treachery
一般會員


發表:5
回覆:3
積分:1
註冊:2007-10-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-01 19:03:02 IP:61.138.xxx.xxx 訂閱

===================引 用 jow 文 章===================
提醒你注意 CloseHandle(hFile); 的位置,
即使WriteFile()沒有成功被執行,應該還是
要call CloseHandle(hFile);




恩,非常感谢,这一点我也注意到了,并将这个函数做成了boolean类型的function,如果成功会返回Ture,否则返回False,这样一来功能就比较完整了,呵呵,感谢你的热心帮助。
------
跳舞吧,如同没有任何人注视你一样;
唱歌吧,如同没有任何人聆听一样;
去爱吧,如同从来没有受过伤害一样;
工作吧,如同不需要金钱一样;
活着吧,如同今天是末日一样;
----艾佛烈德.德索萨
系統時間:2024-04-24 9:19:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!