几乎每个游戏程序都需要使用图形资源,而在VB编程中使用图形资源,一般有两种做法:一是使用图形控件直接把图形保存于程序窗体内或是把图形做成资源文件(*.res);二是采用外接文件的形式,以LoadPicture()函数动态加载图形文件。这两种方法之间的优劣不在本主题讨论范围之内,我本人更倾向于采用第二种方法,但这样做问题也随之而来,游戏程序的作者们通常都不希望别人利用自己原创的图形资源,哪如何保护程序必须使用的外接文件呢?
    今天,我就介绍一种简单方法。VB 提供二进制文件访问的支持,利用该功能重写图形资源文件的数据内容(嘿嘿,说白了就是爬到文件里去做点手脚),就可达到保护该文件(比如:BMP文件不能直接用画图程序打开)的目的。为此,我专门编写了一个程序模块,其中提供了加锁与解锁的公有过程,代码如下:

Attribute VB_Name = "mdlResFileAccess"
'模块 :资源文件保护模块

'版权 :自由电子软件开发社 - TCG设计组
'作者 :PigheadPrince
'日期 :2004-07-03


'<环境设置>
Option Base 1
Option Explicit
Option Compare Binary


'<私有成员>

'文件保护锁头码常数
Private Const m_cLockCode As Integer = 1


'<公有成员>

'名称: [LockResFile]

'目的: 资源文件加锁,生成目标文件

'参数: 1.strSrcPath [String] 资源文件路径
'       2.strDstPath [String] 目标文件路径

Public Sub g_subLockResFile(ByVal strSrcPath As String, ByVal strDstPath As String)
    
    On Error GoTo ERROR_OCCUR
    Dim intFileNo     As Integer
    Dim bytFileData() As Byte
    
    '获得资源文件数据
    intFileNo = FreeFile()
    Open strSrcPath For Binary Access Read Lock Read Write As intFileNo
    ReDim bytFileData(LOF(intFileNo))
    Get intFileNo, , bytFileData()
    Close intFileNo
    
    '生成目标文件
    intFileNo = FreeFile()
    Open strDstPath For Binary Access Write Lock Read Write As intFileNo
    Put intFileNo, 1, m_cLockCode
    Put intFileNo, 5, bytFileData()
    Close intFileNo
    
    Erase bytFileData()
    Exit Sub
    
ERROR_OCCUR:
    Err.Raise vbObjectError + 513, Err.Description

End Sub


'名称: [UnlockResFile]

'目的: 目标文件解锁,还原资源文件

'参数: 1.strDstPath [String] 目标文件路径
'       2.strSrcPath [String] 资源文件路径

Public Sub g_subUnlockResFile(ByVal strDstPath As String, ByVal strSrcPath As String)

    On Error GoTo ERROR_OCCUR
    Dim intFileNo     As Integer
    Dim bytFileData() As Byte
    
    '获得目标文件数据
    intFileNo = FreeFile()
    Open strDstPath For Binary Access Read Lock Read Write As intFileNo
    ReDim bytFileData(LOF(intFileNo))
    Get intFileNo, 5, bytFileData()
    Close intFileNo
    
    '还原资源文件
    
    intFileNo = FreeFile()
    Open strSrcPath For Binary Access Write Lock Read Write As intFileNo
    Put intFileNo, , bytFileData()
    Close intFileNo
    
    Erase bytFileData()
    Exit Sub
    
ERROR_OCCUR:
    Err.Raise vbObjectError + 513, Err.Description

End Sub

    哈哈,轻松搞定!以上代码通过向图形资源文件头部插入一些额外信息(我采用的是4个字节的Integer类型,当然大家也可以换成其他数据类型)来起到保护作用,这样一来,虽然资源文件的扩展名还是保持原样,但是里面的内容已经改变。