在windows下很多程序都可以用右键选择打开方式,
然后选择所要关联的程序就可以打开了,具体是什么原理呢?比如说有一个程序有一个文本框,在磁盘上选择一个文本文件,然后用打开方式选择那个程序,怎样才能让文本中的数据读到文本框中呢???

解决方案 »

  1.   

    [名称]           用VB建立文件关联[语言种类]       Visual Basic[数据来源]       未知[源代码内容]  文件关联是指打开一种类型的文件的默认方式比如默认状态下文本文件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函数的用法然后熟悉注册表操作就能灵活的写出与注册表相关的程序来。
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2003-04-26 下午 07:41:42
               软件版本: 1.0.819
               软件作者: Shawls
                 E-Mail: [email protected]
                     QQ: 9181729
      

  2.   

    [名称]           创建文件关联[语言种类]       Visual Basic[数据来源]       未知[源代码内容]Private Const ERROR_SUCCESS = 0&
    Private Const ERROR_BADDB = 1&
    Private Const ERROR_BADKEY = 2&
    Private Const ERROR_CANTOPEN = 3&
    Private Const ERROR_CANTREAD = 4&
    Private Const ERROR_CANTWRITE = 5&
    Private Const ERROR_OUTOFMEMORY = 6&
    Private Const ERROR_INVALID_PARAMETER = 7&
    Private Const ERROR_ACCESS_DENIED = 8&
    Private Const HKEY_CLASSES_ROOT = &H80000000
    Private Const MAX_PATH = 256&
    Private Const REG_SZ = 1Private Sub Command1_Click()
    Dim sKeyName As String '键名
    Dim sKeyValue As String '键值
    Dim ret&
    Dim lphKey& '从RegCreateKey函数返回的键句柄
    ' 建立一个"MyApp"主键
    sKeyName = "MyApp"
    sKeyValue = "My Application"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue
    , 0&)
    ' 建立一个和"MyApp"相关的.wsh键
    sKeyName = ".wsh"
    sKeyValue = "MyApp"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue
    , 0&)
    ' 给"MyApp"设置命令行参数
    sKeyName = "MyApp"
    sKeyValue = "notepad.exe %1"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "shell\open\command",
    REG_SZ, _
    sKeyValue, MAX_PATH)
    End SubModule'RegCreateKey函数声明
    Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCr
    eateKeyA" _
    (ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    phkResult As Long _
    ) As Long
    'RegSetValue函数声明
    Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSet
    ValueA" _
    (ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByVal dwType As Long, _
    ByVal lpData As String, _
    ByVal cbData As Long _
    ) As Long
    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
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2003-04-26 下午 07:41:57
               软件版本: 1.0.819
               软件作者: Shawls
                 E-Mail: [email protected]
                     QQ: 9181729
      

  3.   

    [名称]           文件关联[语言种类]       Visual Basic[数据来源]       visualbasic2000/csdn[源代码内容]如何在 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 LonghKey: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的默认打开方式就是你编写的播放器了。
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2003-04-26 下午 07:42:04
               软件版本: 1.0.819
               软件作者: Shawls
                 E-Mail: [email protected]
                     QQ: 9181729