注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火力光波的博客

火一般的热情 光一样的速度

 
 
 

日志

 
 

用API建立文件关联实例  

2010-11-15 14:53:33|  分类: win专题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 
API实例解析--建立文件关联
 

文件关联是指打开一种类型的文件的默认方式,比如默认状态下文本文件txt是与记事本程序相关联的,我们双击文本文件,就能直接运行记事本程序来编辑它。文件的关联是通过注册表得以实现的,本例就是利用API函数RegCreateKey和RegSetValue来对注册表进行修改,从中可以看到这两个函数的用法。

为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码

'--------------------------------------
'      利用WinApi函数实现文件关联
'--------------------------------------
'         洪恩在线 求知无限
'--------------------------------------
'程序说明:
'例中利用两个API函数RegCreateKey和
'RegSetValue修改注册表中的相应键值
'实现某一类型文件.log同一个应用程序
'notepad.exe的关联.
'--------------------------------------
'说明&作为数据类型的标示,而不是“与”运算符
'&指Long长整型数据,其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。
'当关联按钮被按下时,读写注册表,完成 .log 文件和 记事本Notepad 的关联
'如果你对注册表的结构和使用不熟悉的话,可以参看“电脑乐园”中的相关教程
Private Sub Command1_Click()
       If CmdPressed = True Then Exit Sub
      
       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"
       ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
       ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)
      
       '为“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 = "关联已经创建"
       Command1.Enabled = False
       CmdPressed = True
End Sub
Private Sub Form_Load()
CmdPressed = False
End Sub
'以下是模块文件中的代码:
Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, lphKey&)
'【VB声明】
'  Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
'【说明】
'  在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项
'【返回值】
'  Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
'【参数表】
'  hKey -----------  Long,要打开项的句柄,或者一个标准项名
'  lpSubKey -------  String,欲创建的新子项。可同时创建多个项,只需用反斜杠将它们分隔开即可。例如level1\level2\newkey
'  phkResult ------  Long,指定一个变量,用于装载新子项的句柄

Declare Function RegSetValue& Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey&, ByVal lpszSubKey$, ByVal fdwType&, ByVal lpszValue$, ByVal dwLength&)
'【VB声明】
'  Private 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
'【说明】
'  设置指定项或子项的默认值
'【返回值】
'  Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
'【参数表】
'  hKey -----------  Long,一个已打开项的句柄,或指定一个标准项名
'  lpSubKey -------  String,欲对它的值进行设置的一个子项的名字。如指定vbNullString,表示设置hKey的默认值。如指定的子项不存在,则会创建它
'  dwType ---------  Long,必须是REG_SZ
'  lpData ---------  String,新值
'  cbData ---------  Long,指定lpData的长度,不包括空中止字符

       Public Const ERROR_SUCCESS = 0&
       Public Const ERROR_BADDB = 1&
       Public Const ERROR_BADKEY = 2&
       Public Const ERROR_CANTOPEN = 3&
       Public Const ERROR_CANTREAD = 4&
       Public Const ERROR_CANTWRITE = 5&
       Public Const ERROR_OUTOFMEMORY = 6&
       Public Const ERROR_INVALID_PARAMETER = 7&
       Public Const ERROR_ACCESS_DENIED = 8&
       Global Const HKEY_CLASSES_ROOT = &H80000000
       Public Const MAX_PATH = 256&
       Public Const REG_SZ = 1

(源程序下载)

我们先来声明API函数,本例中用到的两个函数声明如下:
  Private Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, lphKey&) As Long
  Private Declare Function RegSetValue& Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey&, ByVal lpszSubKey$, ByVal fdwType&, ByVal lpszValue$, ByVal dwLength&) As Long

RegCreateKey函数的作用是在注册表中指定的主键下创建一个新的主键,而如指定的键已经存在,那么函数会打开现有的主键,其中各个参数的意义如下表所示:

参数 意义
hKey Long,要打开键的句柄,或者一个标准键名。例如:HKEY_CLASSES_ROOT 是标准键名
lpSubKey String,欲创建的新子键。如创建多个键,需用反斜杠将它们分隔开。例如:level1\newkey
phkResult Long,指定一个变量,用于得到新子键的句柄,在设置键值时要用到它
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码

 RegSetValue函数用于设置指定键或子键的默认值,它的各个参数的意义如下:

参数 意义
hKey Long,一个已打开键的句柄,可从上面phkResult得到,或是指定一个标准键名
lpSubKey String,要设置键值的一个子键的名字。如指定vbNullString,表示设置hKey的默认值。如指定的子键不存在,则会创建它
dwType Long,必须是REG_SZ
lpData String,新的键值
cbData Long,指定lpData的长度,不包括空中止字符
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码

下面我们看看怎样实现文件关联
       步骤一:在在注册表的HKEY_CLASSES_ROOT下创建MyApp主键:
  ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)

语句中sKeyName已经预先赋值为"MyApp",而函数执行完后lphKey&会返回新创建的主键的句柄,然后我们向句柄lphKey&所指的位置写入键值sKeyValue(已经赋值为"Logfiles")
  ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)

如果这时查看注册表,会发现如下图所示的新主键和键值:

用API建立文件关联实例 - 火力光波 - 火力光波的博客

 步骤二:在注册表的HKEY_CLASSES_ROOT下创建另外一个主键,键名为“.log”,键值为“MyApp”,创建的方法与第一步相同,只不过键名和键值不同。建立此键值的作用是,把“.log”文件关联到“MyApp”主键所规定的内容,这时的注册表如下:

用API建立文件关联实例 - 火力光波 - 火力光波的博客

第三步:我们为“MyApp”设置了一个命令行,也就是在主键MyApp下建立如下主键:

用API建立文件关联实例 - 火力光波 - 火力光波的博客

 实现的代码是:
  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函数的用法,然后熟悉注册表操作,就能灵活的写出与注册表相关的程序来。

 

来源:百度文库 

用注册表修改右键菜单的索引 - 火力光波 - 火力光波的博客
  评论这张
 
阅读(795)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017