建立文件关联 |
|||||||||||||||||||||||||||||||||||
文件关联是指打开一种类型的文件的默认方式比如默认状态下文本文件txt是与记事本程序相关联的我们双击文本文件就能直接运行记事本程序来编辑它。文件的关联是通过注册表得以实现的本例就是利用API函数RegCreateKey和RegSetValue来对注册表进行修改从中可以看到这两个函数的用法。 -------------------------------------- 利用WinApi函数实现文件关联 -------------------------------------- 程序说明: 例中利用两个API函数RegCreateKey和 RegSetValue修改注册表中的相应键值 实现某一类型文件.log同一个应用程序 notepad.exe的关联. -------------------------------------- 说明&作为数据类型的标示而不是“与”运算符 &指Long长整型数据其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。 当关联按钮被按下时读写注册表完成 .log 文件和 记事本Notepad 的关联 如果你对注册表的结构和使用不熟悉的话可以参看“电脑乐园”中的相关教程
Dim sKeyName As String 键的名称 Dim sKeyValue As String 键值 Dim ret& 返回错误信息的变量 Dim lphKey& 此变量用来保存创建的键的句柄 实际效果是在注册表的HKEY_CLASSES_ROOT下创建MyApp目录 sKeyName = "MyApp" *名为MyApp的键名 sKeyValue = "Logfiles" *把键值设为"Logfiles" 在HKEY_CLASSES_ROOT中创建名为sKeyName的键并返回句柄lphKey& ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) 向句柄lphKey&所指的位置写入键值sKeyValue ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&) 在注册表的HKEY_CLASSES_ROOT下创建另外一个目录 .log sKeyName = ".log" *名为.log的键名 sKeyValue = "MyApp" *把键值设为"MyApp"
为“MyApp”设置了一个命令行 sKeyName = "MyApp" *名为MyApp的键名 sKeyValue = "notepad.exe %1" *把键值设为"notepad.exe %1"如果你知道DOS下的.Bat文件的语法的话便知%1指的是要打开的文件 如果该键已经创建则RegCreateKey那么函数会打开现有的项 ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) 下面一句的实际效果是在MyApp键下建立shell\open\command目录并写入键值sKeyValue 说明:放在一个键的shell\open\command下的是打开某一类型文件的应用程序的名称 ret& = RegSetValue&(lphKey&, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH) Command1.Caption = "关联已经创建"
以下是模块文件中的代码:
【VB声明】
【说明】 在指定的项下创建一个新项。如指定的项已经存在那么函数会打开现有的项 【返回值】 Long零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码 【参数表】 hKey ----------- Long要打开项的句柄或者一个标准项名 lpSubKey ------- String欲创建的新子项。可同时创建多个项只需用反斜杠将它们分隔开即可。例如level1\level2\newkey phkResult ------ Long指定一个变量用于装载新子项的句柄
【VB声明】
【说明】 设置指定项或子项的默认值 【返回值】 Long零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码 【参数表】 hKey ----------- Long一个已打开项的句柄或指定一个标准项名 lpSubKey ------- String欲对它的值进行设置的一个子项的名字。如指定vbNullString表示设置hKey的默认值。如指定的子项不存在则会创建它 dwType --------- Long必须是REG_SZ lpData --------- String新值 cbData --------- Long指定lpData的长度不包括空中止字符
我们先来声明API函数本例中用到的两个函数声明如下:
RegCreateKey函数的作用是在注册表中指定的主键下创建一个新的主键而如指定的键已经存在那么函数会打开现有的主键其中各个参数的意义如下表所示:
RegSetValue函数用于设置指定键或子键的默认值它的各个参数的意义如下:
下面我们看看怎样实现文件关联步骤一:在在注册表的HKEY_CLASSES_ROOT下创建MyApp主键:
语句中sKeyName已经预先赋值为"MyApp"而函数执行完后lphKey&会返回新创建的主键的句柄然后我们向句柄lphKey&所指的位置写入键值sKeyValue(已经赋值为"Logfiles")
如果这时查看注册表会发现如下图所示的新主键和键值: 步骤二:在注册表的HKEY_CLASSES_ROOT下创建另外一个主键键名为“.log”键值为“MyApp”创建的方法与第一步相同只不过键名和键值不同。建立此键值的作用是把“.log”文件关联到“MyApp”主键所规定的内容这时的注册表如下: 第三步:我们为“MyApp”设置了一个命令行也就是在主键MyApp下建立如下主键: 实现的代码是: sKeyName = "MyApp" *名为MyApp的键名 sKeyValue = "notepad.exe %1" *把键值设为"notepad.exe %1"%1指的是要打开的文件 如果该键已经创建则RegCreateKey那么函数会打开现有的项 ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) 下面一句的实际效果是在MyApp键下建立shell\open\command目录并写入键值sKeyValue 说明:放在一个键的shell\open\command下的是打开某一类型文件的应用程序的名称 ret& = RegSetValue&(lphKey&, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH) 经过以上几个步骤我们已经建立了“.log”文件和“记事本”程序的关联。总结前面的内容可以发现在VB中采用API对注册表操作的基本思路都是类似的只要我们知道了两个API函数的用法然后熟悉注册表操作就能灵活的写出与注册表相关的程序来。 |