请帮我找一下这段关于释放资源文件的代码存在的问题 |
答題得分者是:wameng
|
treachery
一般會員 發表:5 回覆:3 積分:1 註冊:2007-10-01 發送簡訊給我 |
代码如下:
[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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
果然是版主,被早一步...
[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 發送簡訊給我 |
天!我真的不知道该如何谢谢你,我问了那么多人,那么多社区,可是就是没有人能找出这个问题。
真诚的谢谢你,这个问题完美的解决了,现在的我用热泪盈眶来形容毫不夸张,因为解决这个问题对我来说非常重要。 为了表达我的谢意,我很乐意经常光顾贵论坛,看到我能够回答的问题就尽量详尽解答,作出我力所能及的贡献,以及经常把我的心得拿来在这里发表。再次的感谢!
------
跳舞吧,如同没有任何人注视你一样; 唱歌吧,如同没有任何人聆听一样; 去爱吧,如同从来没有受过伤害一样; 工作吧,如同不需要金钱一样; 活着吧,如同今天是末日一样; ----艾佛烈德.德索萨 |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
treachery
一般會員 發表:5 回覆:3 積分:1 註冊:2007-10-01 發送簡訊給我 |
===================引 用 jow 文 章=================== 提醒你注意 CloseHandle(hFile); 的位置, 即使WriteFile()沒有成功被執行,應該還是 要call CloseHandle(hFile); 恩,非常感谢,这一点我也注意到了,并将这个函数做成了boolean类型的function,如果成功会返回Ture,否则返回False,这样一来功能就比较完整了,呵呵,感谢你的热心帮助。
------
跳舞吧,如同没有任何人注视你一样; 唱歌吧,如同没有任何人聆听一样; 去爱吧,如同从来没有受过伤害一样; 工作吧,如同不需要金钱一样; 活着吧,如同今天是末日一样; ----艾佛烈德.德索萨 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |