clsFileLink.cls
上传用户:sjst8558
上传日期:2010-02-28
资源大小:89k
文件大小:5k
- VERSION 1.0 CLASS
- BEGIN
- MultiUse = -1 'True
- Persistable = 0 'NotPersistable
- DataBindingBehavior = 0 'vbNone
- DataSourceBehavior = 0 'vbNone
- MTSTransactionMode = 0 'NotAnMTSObject
- END
- Attribute VB_Name = "FileLink"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = True
- Attribute VB_PredeclaredId = False
- Attribute VB_Exposed = False
- Option Explicit
- Private Const HKEY_CLASSES_ROOT = &H80000000
- Private Const HKEY_CURRENT_USER = &H80000001
- Private Const HKEY_LOCAL_MACHINE = &H80000002
- Private Const HKEY_USERS = &H80000003
- Private Const HKEY_PERFORMANCE_DATA = &H80000004
- Private Const HKEY_CURRENT_CONFIG = &H80000005
- Private 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, "userfileshell", hKey) '定义它的操作
- ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfileshellopen", hKey) '具体定义操作的名称
- ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfileshellopencommand", hKey) '定义操作的动作
- ExePath = App.Path & "" & App.EXEName & ".exe %1" '获得VB程序名称
- ret = RegSetValue(HKEY_CLASSES_ROOT, "userfileshellopencommand", 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的默认打开方式就是你编写的播放器了。