VB中如何改变文件关联!

来源:百度文库 编辑:神马文学网 时间:2024/04/30 01:13:18
文件关联是指打开一种类型的文件的默认方式比如默认状态下文本文件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&)    
   
    如果这时查看注册表会发现如下图所示的新主键和键值:    
   
    步骤二:在注册表的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函数的用法然后熟悉注册表操作就能灵活的写出与注册表相关的程序来。