您当前位于: 首页 » Visual Basic » 用VB 向Exe文件 写入标准资源,在VB中资源文件的操纵

用VB 向Exe文件 写入标准资源,在VB中资源文件的操纵04/26/2007

    网上铺天盖地的帖子都是说VB中loadresdata(),loadresstring(),……这些个函数的,完全都是说怎样在VB里头读取资源的事,我们都知道VB支持String,Icon,Cursor,BitMap,CUSTOM等几类Win32 标准资源。
   使用的时候用VB中的资源编辑器,将标准资源保存到其中,然后就是用前面提到的那几个函数变着戏法的调用,觉得这样很有意思似的。崩溃!
    我想解决的问题是如何向一个EXE文件中写入资源,或者把这个EXE文件中之前含有的标准资源替换掉,这个功能有点类似于资源修改工具,例如exeScope、ResHacker等,这个肯定要用到API的,查了一下,相关的API有:
BeginUpdateResource(),UpdateResource(),EndUpdateResource(),很好理解他们的功能,先打开资源文件句柄准备更新资源,更新资源,关闭句柄。

   一切似乎都已经解决了!

   其实,问题才刚刚开始,那就是不管我怎么调用这几个API,出来都不是我要的结果。

   首先,没有找到资料它能更新字符串表格资源,还有icon、Cursor等资源,唯一能正确更新的就是VB中“独有”的CUSTOM资源,问题也就出在这里了!

   我先做了个含有一个自定义资源的VB文件,资源为一个文本(“我不是个随便的人,我随便起来不是人!”)用form的caption来显示!
[codes=vb]
Private Sub Form_Load()
Dim myRes
myRes = LoadResData(101, “CUSTOM”)
Form1.Caption = StrConv(myRes, vbUnicode)
End Sub
[/codes]

运行结果

编译生成后的文件取名为target.exe,放到d盘根目录!
下面再来弄个主程序来对它进行资源写入!
[codes=vb]
Option Explicit
'API声明
Private Declare Function BeginUpdateResource Lib “kernel32″ Alias “BeginUpdateResourceA” (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long

Private Declare Function UpdateResource Lib “kernel32″ Alias “UpdateResourceA” (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long

Private Declare Function EndUpdateResource Lib “kernel32″ Alias “EndUpdateResourceA” (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long


Private Sub Cmd_Write_Click()
    Dim hRes As Long
    Dim myStr() As Byte
    myStr = StrConv(Text1.Text, vbFromUnicode)
    hRes = BeginUpdateResource(“d:\target.exe”, False)
    UpdateResource hRes, “CUSTOM”, 101, 2052, myStr(0), Len(Text1.Text)
    EndUpdateResource hRes, False
End Sub
[/codes]

写入显示是成功的!可当我迫不及待的打开target.exe的时候,其标题并没有改变!!!晕~

而当我用resHacker打开target.exe的时候……



在reshacker中出现了两个101,怎么可能同一类的资源可以有两个相同的ID??

后来解决了这个问题,就是将原target代码的
LoadResData(101, “CUSTOM”),改成LoadResData(“101″, “CUSTOM”),就可以正常调用我们写入的资源!

虽然解决了小问题,可是,我怎么才能修改原来的那个ID为101的资源啊!

令我不爽也就是在这里,标识怎么成字符串了呢?(更新了,更新了,我在后来的一篇文章里解决了此问题VB操纵标准资源的一点补充

3,926位童鞋围观 | 7条评论标签:  

7条评论
  1. 金灯剑客 说:

    “VB操纵标准资源的一点补充”
    这篇文章删除了? 找不到! 我的小软件(右键背景修改器)出来了,在我的QQ空间里面!
    有兴趣看看!加我的Q:250321772

  2. vzxcz 说:

    怎样修改当前的VB应用程序的资源文件呢?
    这个API好你不行

    • gently 说:

      好我不行?你是什么性别?要不咱俩比试比试

  3. test 说:

    UpdateResource hRes, "CUSTOM", 101, 2052, myStr(0), Len(Text1.Text)

    根据声明API的参数类型,上面这一句中的参数有问题,101处应该是字符串,所以才会有错误的结果。按照你的写法,程序自动将其转换成了字符串"101"。

  4. hehe 说:

    佩服你的??精神,?!

发表评论

(发广告、垃圾评论者请慎重,点击左边按钮可能会造成下半身永久性创伤)