再问.res文件读取问题

mfkinfo 2008-11-15 12:34:13
可以是太心急,原提问无法刷新啦,只得再次开问,还请各位大侠鼎力帮助啊。
如何在VB设计中枚举.res文件中的资源,即读取.res文件中资源的ID、Name、size。急啊,困挠了近月吧啦……
...全文
262 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfkinfo 2008-11-19
  • 打赏
  • 举报
回复
观念完全不同,无言。
僵哥 2008-11-17
  • 打赏
  • 举报
回复
软件的开源及共享是指将自己已经形成的劳动产物共享出来,让它产生更高的价值.
但是你所需要的是"义工"而不是"共享".所谓义工,即是为了别人的目的无尝劳动.
僵哥 2008-11-16
  • 打赏
  • 举报
回复
中国IT最为悲哀的是大家都想吃"免费的午餐"
僵哥 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mfkinfo 的回复:]
难题?诸位高手也认为是难题?我的想法并不复杂啊,我只想获取常规的资料,就是僵哥所说的较好处理的那部分。
看来诸位高手都是有思路的,只是……。难怪中国软件上不了台阶--感慨而已,并不针对某人,不要对号入座。
目前我已经把VB放在一旁了,我想我得学学delphi。高手不愿意做的事情,也总得有人做啊。
希望有心人在我还没有学完delphi之前完成它,唉——悲哀——中国IT
[/Quote]
学会看MSDN的资料
mfkinfo 2008-11-16
  • 打赏
  • 举报
回复
经常有成功人士说,他之所以成功就因为他站在巨人的肩膀上。因此,我不因为“吃免费的午费”有什么错。一个人的精力发竟是有限的,鲁迅先生不也主张“拿来主义”吗?当然,要吸收,要消化。中国IT业人员大多闭门锁国、跓足不前、孤风自赏,就如同中国开放前,这恰恰阻哀的中IT的发展。中国法律不把学习别人的软件作为犯罪,为的就是学习者能够快速提高。相信unsigned兄也是一位热心IT的软件先学者,否则也不会频频帮助他人啦。希望能教无不尽,既然大家认为是一个值得研究的课题,为什么不研究一下呢?
在单位里,只要有人问我问题,我总是知无不言,言无不尽;有问题自己解决不了的,常常是整宿整宿的捉摸,爬网。我不认为我是一位单纯地想吃“免费午费”的人。有前辈认为现时社会多数人懒惰、不好学,自己固守自己。“各尽各力,社会总是在进步的。”作为先行者带动大家向前,自己不也荣耀吗?我希望向所有人学习——包括趾高气昂的人,他们之所以这样,自然有这样的理由。只希望他们不要封闭。
随便问一下:有几个没有用过盗版软件?没有用过?番茄花园这么火——火得微软都把它“疯”掉了——我就想不通了。
僵哥 2008-11-15
  • 打赏
  • 举报
回复
僵哥 2008-11-15
  • 打赏
  • 举报
回复
如果想直接读取.res文件当中的内容,只能解析.res文件,这个是比较难的。建议可以把.res添加到工程当中编译出来,然后再通过API:EnumResourceModules(这个并不是非常必要,除非有加载某些如DLL之类的资源模块才用得上,直接使用App.hInstance作为ModueInstance即可) + EnumResourceTypes + EnumResourceNames
mfkinfo 2008-11-15
  • 打赏
  • 举报
回复
难题?诸位高手也认为是难题?我的想法并不复杂啊,我只想获取常规的资料,就是僵哥所说的较好处理的那部分。
看来诸位高手都是有思路的,只是……。难怪中国软件上不了台阶--感慨而已,并不针对某人,不要对号入座。
目前我已经把VB放在一旁了,我想我得学学delphi。高手不愿意做的事情,也总得有人做啊。
希望有心人在我还没有学完delphi之前完成它,唉——悲哀——中国IT
僵哥 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chenjl1031 的回复:]
引用 9 楼 unsigned 的回复:
你要的单元在这里有:
http://code.google.com/p/zgameeditor/source/browse/trunk/tools/?r=7#tools/ZDesigner/3rdparty


僵哥做出来,也让我们学习学习,枚举资源文件是个难题,2楼那个我也看了,不是很理想!
[/Quote]
系统定义的几种资源当中,只有图片鼠光标和字符串相对比较常用也比较好处理,其它都比较复杂。而如果是别人自定义的类别,如果你不知道格式几乎是无处理的。
东方之珠 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 unsigned 的回复:]
你要的单元在这里有:
http://code.google.com/p/zgameeditor/source/browse/trunk/tools/?r=7#tools/ZDesigner/3rdparty
[/Quote]

僵哥做出来,也让我们学习学习,枚举资源文件是个难题,2楼那个我也看了,不是很理想!
僵哥 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mfkinfo 的回复:]
http://www.tommstudio.com/ViewArticles.aspx?ID=1013
http://hi.baidu.com/rarnu/blog/item/619ed02a32e7cf99023bf6ed.html
以上两个网页上都有列出资源的代码,不过开发语言是delphi。
代码也不算长,如果API函数中有下列3个函数,相信同时会delphi和VB语言的朋友改写不用多长时间就可以完成吧?
unitResourceGraphics
unitResourceDetails
unitResourceMessages
可是我在MSDN中并没有,谁能给介绍一下么?
[/Quote]
delphi代码不长,并不代表VB当中就不长。
mfkinfo 2008-11-15
  • 打赏
  • 举报
回复
http://www.tommstudio.com/ViewArticles.aspx?ID=1013
http://hi.baidu.com/rarnu/blog/item/619ed02a32e7cf99023bf6ed.html
以上两个网页上都有列出资源的代码,不过开发语言是delphi。
代码也不算长,如果API函数中有下列3个函数,相信同时会delphi和VB语言的朋友改写不用多长时间就可以完成吧?
unitResourceGraphics
unitResourceDetails
unitResourceMessages
可是我在MSDN中并没有,谁能给介绍一下么?
僵哥 2008-11-15
  • 打赏
  • 举报
回复
虽然代码都是现成的,但是要改成VB,那也不是很简单的事情。如果你把所有的东西都弄完,粗粗估计也要半个月到一个月,而且还要求其中所有的技术访问都比较娴熟。
如果只是把资源数据的结构分解出来,倒不算难。MSDN([http://msdn.microsoft.com/en-us/library/ms648027(VS.85).aspx][/url])已经说得很清楚。
基本上:
struct RESOURCEHEADER { 
DWORD DataSize;
DWORD HeaderSize;
[Ordinal or name TYPE];
[Ordinal or name NAME];
DWORD DataVersion;
WORD MemoryFlags;
WORD LanguageId;
DWORD Version;
DWORD Characteristics;
};

改为VB就是:
Type RESOURCEHEADER { 
DataSize as Long
HeaderSize as Long
ResType as Variant ' [Ordinal or name TYPE];
ResName as Variant '需要说明的就是这里的Type和Name,有可能是一个字符串,也有可能是一个双字节整型,所以用Variant[Ordinal or name NAME];
DataVersion as Long
MemoryFlags as Integer
LanguageId as Integer
Version as Long
Characteristics as Long
ResData() as Byte '这是具体的数据,可以留给后续处理时使用,仅当DataSize<>0时才有
End Type


读取的时候,可以直接读取八个字节到DataSize+HeaderSize

其中HeaderSize是包括DataSize和HeadSize在内的整个资源描述头的占用字节数,当这个HeaderSize确定之后,自然就可以根据DataSize读取具体的数据住处到ResData(读入前记得ReDim,仅当DataSize不为“零”时处理),剩余的就是下一段的数据的,可以不用理会

接着就是ResType和ResName的处理.先假定整个头部的信息为ResHead,那么前面已经处理了八个字节,接下来就从第九个字节开始处理,如果第9+第10个字节合起来为一个字(Word),可以直接Copy到Integer类型当中,如果其值为&hFFFF(一个无效的Unicode字)相当于-1(Integer),则后面接着的两个字节就是一个数字,即ResType为两个字节的数值(具体代表是什么资源可以自己查MSDN:http://msdn.microsoft.com/en-us/library/ms648009(VS.85).aspx),如果第9和第10个字节合起来不是&hFFFF,则表示ResType是了个Unicode字串,那么就两个字节两个字节的查,直到为0(Integer),假字第11和12字节合起来是0值,则9和10组成了一个Unicode字,只时只需要使用一个string变量分配一个字节,比如StrResType = space(1),然后再通过CopyMemory复制两个字节到StrResType当中,就取得了ResType,把11和12这个0值抛弃,(提示:请记录从第9个字节开始已经处理了多少个字节,比如记作nResType,后面还有用)。

接着是ResName的处理,处理方法跟ResType一样,同样的也要记录处理了多少字节,记作nResName

计算nResType+nResName 模(mod)上4,如果不为0(只能是2),则继续抛弃2个字节,否则不需要继续往下。

后面就非常简单了,DataVersion要四个字节,MemoryFlags要两个字节,LanguageId要两个字节,Version要四个字节,Characteristics要四个字节。

如此一段资源就分解完了。

数据部分则要根据ResType去处理,如果是系统预定义的类型,则参考具体的资源结构进行分解和处理。但是有些结构是用户自定义的,你就只能把它当二进制数据读取出来。当然,如果其中是二进制文件资源的话,比如PE文件(包括.exe或.dll等)可以通过检测PE文件的格式来确定。

一口气写了这么多,希望对需要的朋友有些帮助。
mfkinfo 2008-11-15
  • 打赏
  • 举报
回复
大家用过XNResourceEditor3资源编辑器没有,它就实现了对.Res文件的资源调用。
网上可以查找xn_resourceeditor_source3.0.0.1的源代码,可惜是delphi编写的,我看不懂。谁能帮我把核心部分转为VB吗?先谢了!
本人邮箱:mfkwine@wine.sina.com
源代码地址:www.quxp.com
ultraedit55 2008-11-15
  • 打赏
  • 举报
回复
oo
android2008 2008-11-15
  • 打赏
  • 举报
回复
oo

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧