如何在 VB6.0中 创建自己的文件类型
在Windows中,当我们双击一个.txt文件的时候,“记事本”程序会自动打开,并且显示.txt文件的内容;当我们将一个.txt文件拖到“记事本”的图标上的时候,“记事本”程序也会自动打开,并且显示.txt文件的内容。在Windows中,这种技术称为“文件关联”,是一种非常实用,大大方便操作者的功能。当我们自己设计了一个程序,往往自己的程序需要使用自己定义的文件才能运行。例如,我曾经设计了一个“填字游戏”,这个游戏需要一种“字谜文件”来支持,如果用户要玩“填字游戏”,他们必须首先启动“填字游戏”的程序,然后在菜单上面选择“文件”,然后是“打开字谜”,接着在“打开字谜”的对话框中选择一个字谜文件,最后按下“开始游戏”才能进行游戏。我一直在想,能不能简化这些操作,用户只要双击“字谜文件”,系统就能自动完成前期的操作,用户只要按下“开始游戏”就能进行游戏了。可能在VC中这样的功能很容易实现的,但是VB行不行呢?答案是“完全可以!!!”
首先,为了简化说明过程,我们要明确一下任务,现在假设有一个我们自定义的文件类型 .abc ;还有一个VB程序。当我们双击自定义文件 .abc的图标,或者我们将图标拖到程序图标的时候,我们要求程序能够自动启动,同时获得 .abc文件的文件名,这样,就能对这个文件进一步操作了。(为了说明问题,我们假设,当程序自动运行后将文件名作为窗体的标题,当然,你也能获得文件名后,用你的程序打开这个文件。)
好了,下面就开始编写程序了。第一个要解决的问题就是如何用程序将.abc文件和我们的VB程序“关联”起来呢?在这里,我们使用修改“注册表”的方法来实现文件关联。让我们先定义一个模块,在模块中定义一些常量和API函数。
(以下常数要使用到的,我会加以说明)
Option Explicit
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
(以上函数是一些注册表的常量,用来定义 hKey)
Enum ValueType
REG_NONE = 0
REG_SZ = 1
REG_EXPAND_SZ = 2
REG_BINARY = 3
REG_DWORD = 4
REG_DWORD_BIG_ENDIAN = 5
REG_MULTI_SZ = 7
End Enum
(这个枚举是用来定义 dwType)
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String,
phkResult As Long) As Long ´这个函数是用来创建注册表的主键
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long ´这个函数用来关闭打开的注册表
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long ´这个函数用来改写注册表的键值
相关的三个API函数是:RegCreateKey[建立SubKey]和RegClose[关闭SubKey]
详细说明:
RegCreateKey函数:
VB声明 Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA"
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
hKey:Key Handle
lpSubKey:SubKey名称或路径
phkResult:若RegOpenKey执行成功,则这一参数返回Subkey的hKey.
返回值: =0,表示成功;≠0,表示失败。[注意这一点与别的API函数不太一样]
它的参数用法与RegOpenKey一样。所不同的是RegOpenKey只能打开已经有的SubKey,而RegCreateKey则可以建立SubKey,比较特别的是,如果调用RegCreateKey所建立的SubKey是一个已经存在的SubKey,则它的功能和RegOpenKey相同。由于RegCreateKey的这种特性,有的程序员干脆不用RegOpenKey,而用RegCreateKey来统一代替RegOpenKey。
RegClose函数:
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
hKey:Key Handle
lpSubKey:Subkey名称或路径
dwType:数据类型,但在这里只能接受REG_SZ[字符串类型]
lpData:所设置的字符串
cbData:lpData字符串的长度,这一长度包括chr(0)字符。
关于dwType的可能取值
有了这些注册表的操作函数后,我们就开始定义我们的文件类型了。这个过程其实很简单的。
1.在注册表中定义 .abc 文件 说明这个文件的类型是用户文件 "userfile"
2.在注册表的"userfile"中定义打开这种文件的程序(就是我们的VB程序!)
具体的源代码如下:
Sub Main()
Dim ret As Long, hKey As Long, ExePath As String
ret = RegCreateKey(HKEY_CLASSES_ROOT, ".abc", hKey) ´定义 .abc文件
ret = RegSetValue(HKEY_CLASSES_ROOT, ".abc", REG_SZ, "userfile", 9) ´定义文件的类型,注意最后一个数字,它是 "userfile"的字节数 + 1
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile", hKey) ´定义"userfile"
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell", hKey) ´定义它的操作
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell\open", hKey) ´具体定义操作的名称
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfile\shell\open\command", hKey) ´定义操作的动作
ExePath = App.Path & "\" & App.EXEName & ".exe %1" ´获得VB程序名称
ret = RegSetValue(HKEY_CLASSES_ROOT, "userfile\shell\open\command", REG_SZ, ExePath, LenB(StrConv(ExePath, vbFromUnicode)) + 1)
´最关键的一步!将 "userfile" 的打开(open)操作和我们的程序关联起来
RegCloseKey hKey
End Sub
这样,当我们以后双击 .abc的图标以后,就能自动打开我们的VB程序了。当然,这样只能实现打开程序,程序怎么能知道我们双击的文件名呢?好,我们现在创建一个窗体来说明一下这个问题。
在加载窗体的时候,加上这样的源代码:
Private Sub Form_Load()
Dim ss As String ’定义一个字符变量
ss = Command() ’最关键的一步!用这个函数来获得命令行参数!!就是上面提到的 "%1" ,换句话来说,就是文件名!
Me.Caption = ss ’好了,窗体上面就是你的文件名了!(当然,有了文件名,想干什么,你就自己决定吧!)
End Sub
当然,你先要判断一下程序是不是第一次运行,如果是第一次运行的话,在加载窗体前,先执行一下 Sub Main(),进行文件的关联。
好了,学会后,你就能在程序中使用自定义的文件了,或许某一天,.mp3的默认打开方式就是你编写的播放器了。
文章来源于领测软件测试网 https://www.ltesting.net/