可以是太心急,原提问无法刷新啦,只得再次开问,还请各位大侠鼎力帮助啊。
如何在VB设计中枚举.res文件中的资源,即读取.res文件中资源的ID、Name、size。急啊,困挠了近月吧啦……

解决方案 »

  1.   

    如果想直接读取.res文件当中的内容,只能解析.res文件,这个是比较难的。建议可以把.res添加到工程当中编译出来,然后再通过API:EnumResourceModules(这个并不是非常必要,除非有加载某些如DLL之类的资源模块才用得上,直接使用App.hInstance作为ModueInstance即可) + EnumResourceTypes + EnumResourceNames
      

  2.   

    可以参考:
    http://www.ex-designz.net/apidetail.asp?api_id=614
      

  3.   

    大家用过XNResourceEditor3资源编辑器没有,它就实现了对.Res文件的资源调用。
    网上可以查找xn_resourceeditor_source3.0.0.1的源代码,可惜是delphi编写的,我看不懂。谁能帮我把核心部分转为VB吗?先谢了!
    本人邮箱:[email protected]
    源代码地址:www.quxp.com
      

  4.   

    虽然代码都是现成的,但是要改成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文件的格式来确定。一口气写了这么多,希望对需要的朋友有些帮助。
      

  5.   

    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中并没有,谁能给介绍一下么?
      

  6.   

    delphi代码不长,并不代表VB当中就不长。
      

  7.   

    你要的单元在这里有:
    http://code.google.com/p/zgameeditor/source/browse/trunk/tools/?r=7#tools/ZDesigner/3rdparty
      

  8.   

    难题?诸位高手也认为是难题?我的想法并不复杂啊,我只想获取常规的资料,就是僵哥所说的较好处理的那部分。
    看来诸位高手都是有思路的,只是……。难怪中国软件上不了台阶--感慨而已,并不针对某人,不要对号入座。
    目前我已经把VB放在一旁了,我想我得学学delphi。高手不愿意做的事情,也总得有人做啊。
    希望有心人在我还没有学完delphi之前完成它,唉——悲哀——中国IT
      

  9.   

    经常有成功人士说,他之所以成功就因为他站在巨人的肩膀上。因此,我不因为“吃免费的午费”有什么错。一个人的精力发竟是有限的,鲁迅先生不也主张“拿来主义”吗?当然,要吸收,要消化。中国IT业人员大多闭门锁国、跓足不前、孤风自赏,就如同中国开放前,这恰恰阻哀的中IT的发展。中国法律不把学习别人的软件作为犯罪,为的就是学习者能够快速提高。相信unsigned兄也是一位热心IT的软件先学者,否则也不会频频帮助他人啦。希望能教无不尽,既然大家认为是一个值得研究的课题,为什么不研究一下呢?
    在单位里,只要有人问我问题,我总是知无不言,言无不尽;有问题自己解决不了的,常常是整宿整宿的捉摸,爬网。我不认为我是一位单纯地想吃“免费午费”的人。有前辈认为现时社会多数人懒惰、不好学,自己固守自己。“各尽各力,社会总是在进步的。”作为先行者带动大家向前,自己不也荣耀吗?我希望向所有人学习——包括趾高气昂的人,他们之所以这样,自然有这样的理由。只希望他们不要封闭。
    随便问一下:有几个没有用过盗版软件?没有用过?番茄花园这么火——火得微软都把它“疯”掉了——我就想不通了。