找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7606|回复: 3

[求助] 如何用UpdateResource替换位图文件

  [复制链接]

3

主题

3

回帖

0

精华

初来乍到

积分
24
发表于 2010-2-7 13:08:27 | 显示全部楼层 |阅读模式
UpdateResource这个函数可以替换自定义资源文件,可是替换位图文件的时候出现了问题,替换的时候成功,可是在程序调用的时候提示无效图片...我知道是函数写错了,该怎样解决这个问题呢?
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 Long, ByVal lpName As Long, 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 Const RT_BITMAP = 2&

Private Function WriteRes(ByVal ResFileName As String, ByVal WriteFileName As String, ByVal ResID As Long) As Boolean
Dim VbArrayRes() As Byte '写入内容
Dim hUpdate As Long '被写入的目标文件路径
Dim Ret As Long '资源句柄
    hUpdate = BeginUpdateResource(WriteFileName, False) '打开要写入的目标文件
    ReDim VbArrayRes(FileLen(ResFileName) - 1) '计算资源文件大小
    Open ResFileName For Binary As #1 '获取资源文件内容
        Get #1, , VbArrayRes
    Close #1
    Ret = UpdateResource(hUpdate, RT_BITMAP, ResID, 2052, VbArrayRes(0), UBound(VbArrayRes) + 1) '添加资源
        If Ret <> 0 Then
            WriteRes = True
        End If
    '关闭资源更新
    Ret = EndUpdateResource(hUpdate, False)
End Function
Private Sub Command2_Click()
WriteRes "C:\Documents and Settings\Administrator\桌面\test.bmp", "C:\Documents and Settings\Administrator\桌面\test.exe", 101
End Sub

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-2-8 11:47:49 | 显示全部楼层
减去一个文件头就可以了,不需要将整个文件加载进去的.

对于BITMAP文件,其文件头:
  1. Private Type BITMAPFILEHEADER
  2.     bfType As Integer      '2字节
  3.     bfSize As Long           '4字节
  4.     bfReserved1 As Integer
  5.     bfReserved2 As Integer
  6.     bfOffBits As Long
  7. End Type
复制代码
长度为2+4+2+2+4=14字节,那么UpdateResource这句改成这样就行了:
  1. Ret = UpdateResource(hUpdate, RT_BITMAP, ResID, 2052, VbArrayRes(14), UBound(VbArrayRes) -14 + 1) '添加资源
复制代码
我就是嗷嗷叫的老马了......

3

主题

3

回帖

0

精华

初来乍到

积分
24
 楼主| 发表于 2010-2-8 16:47:04 | 显示全部楼层
行了,马哥真厉害,太佩服了{:2_31:}

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-2-9 02:26:40 | 显示全部楼层
其实我只是治了个标.......这个函数所需要的条件我还是不清楚,不过是利用工具找到了这个特定格式的规律而已....

具体过程:

http://www.m5home.com/blog/article.asp?id=406

要治本,还得是老老实实地啃MSDN啊.....:L
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表