请问各位大虾
如何用vb或delphi程序代码使自己的可执行文件(.EXE)成为打开某种扩展名的文件的默认打开程序
好象双击*.txt直接用NOTEPAD.EXE打开
好象双击*.doc直接用word.EXE打开
好象双击*.mp3直接用winamp.EXE打开
即只需双击此类文件(扩展名相同)自动用自己的EXE打开
急,急,急
重酬,谢了

解决方案 »

  1.   

    在Windows操作系统中改变文件打开方式 
        在Windows 95/NT/98操作系统中改变文件打开方式的问题,又可称为改变文件类型关联的问题,即把某类型(扩展名)的文件与某应用程序关联,例如通常当双击*.txt文件时系统自动调用Notepad.exe。本文介绍利用Windows注册表编辑器Regedit.exe手工或编程改变文件打开方式的方法,并提供程序实例。
      一、基本思路:
      1、注册表编辑器Regedit.exe是用于更改系统注册表设置的高级工具,包含了关于系统配置及运行的重要信息,默认访问路径为C:\Windows\Regedit.exe。双击Regedit.exe图标,运行注册表编辑器。在左侧显示栏内看到HKEY_CLASSES_ROOT、KEY_CURRENT_USER、HKEY_LOCAL_MACHINE等主键。与文件类型有关的所有主键、键名、键值都存放在HKEY_CLASSES_ROOT下。
      ◆双击HKEY_CLASSES_ROOT,向下拖动滚动条,找到.txt主键,右侧显示栏内“txtfile”说明:在HKEY_CLASSES_ROOT下有一txtfile主键,其下存放了打开*.txt文件应用程序的有关信息。
      ◆向下拖动滚动条,找到txtfile主键,右侧显示栏内“文本文档”为文件类型描述。双击txtfile,DefaultIcon右侧显示栏内“shell32.dll,-152”为*.txt文件的图标;shell\open\command,右侧显示栏内“C:\WINDOWS\NOTEPAD.EXE %1”为打开*.txt文件的应用程序名称及参数。  改变打开文件方式的方法(例如用VISIO打开*.exc文件):
      ◆手工:打开系统注册表,在HKEY_CLASSES_ROOT下找到.exc及另一主键名,找到此主键,将shell\open\command右侧显示栏内“C:\WINDOWS\NOTEPAD.EXE %1”改为“C:\VISIO.EXE %1”(假设VISIO.EXE的访问路径是C:\,具体视情况而定),按F5刷新系统注册表。
      ◆编程:利用VB、Delphi、C++Builder等读写系统注册表,可自动改变文件打开方式。本文提供VB、Delphi编程实例。
      二、编程实例:
      ㈠利用VB编程
      1、在VB5.0 IDE中,新建工程Project1,在Form1上添加命令按钮Command1。
      2、选择菜单“工程”—“添加模块”—“模块”—“打开”,在Project1中添加模块Moudle1。
      3、在Moudle1“通用—声明”部分声明API函数和常量。
      Const REG_SZ = 1
      Global Const HKEY_CLASSES_ROOT = &H80000000
    Declare Function OSRegQueryValueEx Lib “advapi32”Alias “RegQueryValueExA”(ByVal hKey As Long, ByVal lpszValueName As String,
    ByVal dwReserved As Long, lpdwType As Long, lpbData As Any, cbData As Long) As Long
    Declare Function OSRegOpenKey Lib “advapi32”Alias “RegOpenKeyA”(ByVal hKey As Long, ByVal lpszSubKey As String, phkResult As Long) As Long
    Declare Function OSRegSetValueEx Lib“advapi32”Alias “RegSetValueExA”(ByVal hKey As Long, ByVal lpszValueName As String,
    ByVal dwReserved As Long, ByVal fdwType As Long, lpbData As Any, ByVal cbData As Long) As Long
    Declare Function OSRegCloseKey Lib“advapi32”Alias “RegCloseKey”(ByVal hKey As Long) As Long
      4、在Moudle 1中编写函数。
      Function RegOpenKey(ByVal hKey As Long, ByVal lpszSubKey As String,
    phkResult As Long) As Boolean
       Dim lResult As Long
       On Error GoTo 0 ` 关闭错误陷阱
       lResult = OSRegOpenKey(hKey, lpszSubKey, phkResult)
       If lResult = 0 Then
       RegOpenKey = True
       Else
       RegOpenKey = False
       End If
      End Function
      Function RegSetStringValue(ByVal hKey As Long, ByVal strValueName As String,
    ByVal strData As String, Optional ByVal fLog) As Boolean
       Dim lResult As Long
       On Error GoTo 0
       lResult = OSRegSetValueEx(hKey, strValueName, 0&, REG_SZ, ByVal strData,
    LenB(StrConv(strData, vbFromUnicode)) + 1)
       If lResult = 0 Then
       RegSetStringValue = True
       Else
       RegSetStringValue = False
       End If
      End Function
      Function StripTerminator(ByVal strString As String) As String
       Dim intZeroPos As Integer
       intZeroPos = InStr(strString, Chr$(0))
       If intZeroPos >  0 Then
      StripTerminator=Left$(strString, intZeroPos - 1)
       Else
       StripTerminator = strString
       End If
      End Function
      Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String,
    strData As String) As Boolean
       Dim lResult As Long
       Dim lValueType As Long
       Dim strBuf As String
       Dim lDataBufSize As Long
       RegQueryStringValue = False
       On Error GoTo 0
       lResult = OSRegQueryValueEx(hKey, strValueName, 0&, lValueType, ByVal 0&,
    lDataBufSize)
       If lResult = ERROR_SUCCESS Then
       If lValueType = REG_SZ Then
       strBuf = String(lDataBufSize, “”)
       lResult = OSRegQueryValueEx(hKey, strValueName, 0&, 0&, ByVal strBuf,
    lDataBufSize)
       If lResult = ERROR_SUCCESS Then
       RegQueryStringValue = True
       strData = StripTerminator(strBuf)
       End If
       End If
       End If
      End Function
      5、双击Command1,编写Click事件代码。
      Private Sub Command1_Click()
       Dim hKey As Long
       Dim MyReturn As Long
       Dim MyData As String
       MyReturn = OSRegOpenKey(HKEY_CLASSES_ROOT, “.exc”, hKey)
      MyReturn=RegQueryStringValue(hKey,“”,MyData)
      MyReturn=OSRegOpenKey(HKEY_CLASSES_ROOT, MyData+“\shell\open\command”,hKey)
       MyReturn = RegSetStringValue(hKey,“”,“c:\visio.exe 1%”, False)
       If MyReturn Then
       MsgBox “改变文件打开方式成功!”,vbInformation,“请注意”
       Else
       MsgBox “改变文件打开方式失败!”,vbExclamation,“请注意”
       End If
       OSRegCloseKey (hKey)
      End Sub
      6、按F5运行程序,在简体中文Windows95/NT/98、VB5.0/6.0环境中调试通过。
      ㈡利用Delphi编程
      1、在Delphi3.0 IDE中,新建工程Project1,在Form1上添加按钮Button1。
      2、在uses子句中添加Registry。
      3、双击Button1,编写Click事件代码。
      procedure TForm1.Button1Click(Sender: Tobject);
      var
       MyRegistry : TRegINIFile;
       Return:string;
      begin
       try
       MyRegistry := TRegINIFile.Create(``);
      MyRegistry.RootKey := HKEY_CLASSES_ROOT;
       Return:=MyRegistry.ReadString (`.gid`,``,`No! Not Found the Key!`);
       MyRegistry.WriteString(Return,``,`这只是一个演示!`);
       MyRegistry.WriteString(Return+`\DefaultIcon`,``,`c:\visio.exe,1`);
       MyRegistry.WriteString(Return+`\shell\open\command`,``,`c:\visio.exe %1`);
       finally
       MyRegistry.Free;
       end;
       ShowMessage(`改变文件打开方式成功!`);
      end;
      4、按F9运行程序,在简体中文Windows95/NT/98、Delphi3.0/4.0环境中调试通过。
      

  2.   

    最简单的:使用外部DOS命令Start.EXE
    1.Start.EXE在Windows98/ME的Windows/Command目录下,拷贝出来。
    2.Start.EXE可以在任何版本32位Windows下运行(9x/NT/2000/XP/2003)
    3.使用类似下面的语句即可。 Shell "c:\start.exe c:\001.txt"
      

  3.   

    注意:NT/2000/XP/2003没有Start.EXE,因为在NT的命令提示符程序中,Start是内部命令,我们可以从Win9X下拷贝出来运行。当然,在NT下也可以编写一个批处理文件,内容类似为:
    Start C:\001.TXT
    Exit
    然后Shell这个批处理程序,但是没有上面的方法好,因为在Win9X下(也可能是NT,很长时间没用DOS,记不清了)程序退出后会留下DOS窗口。如果你没有Start.EXE,把邮箱给我。
      

  4.   

    用start只能在程序中调用指定程序打开某个文件,不符合楼主的要求
      

  5.   

    不是的,Start完全符合楼主的要求,打开文件的程序不是指定的,而是有系统的文件关联决定的。就像Start C:\1.TXT,我并没有指定用记事本打开。类似地,Start C:\1.DOC,则在没有安装Word的机器上用写字板打开,否则用Word打开。
      

  6.   

    这里是Windows Server 2003中运行Start/?得到的帮助,与Win9X下的Start.EXE略有出入。
    启动另一个窗口运行指定的程序或命令。START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHAR
          [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BEL
          [/WAIT] [/B] [command/program]
          [parameters]    "title"     在窗口标题栏中显示的标题。
        path        起始目录
        B           在不创建新窗口的情况下开始应用程序。除非
                    启动 ^C 处理,否则该应用程序会忽略 ^C 处理;
                     ^Break 是唯一可以中断该应用程序的方式
        I           新环境是传递给 cmd.exe 的原始环境,
                    而不是当前环境
        MIN         开始时窗口最小化
        MAX         开始时窗口最大化
        SEPARATE    在分开的内存空间内开始 16 位 Windows 程序
        SHARED      在共享内存空间内开始 16 位 Windows 程序
        LOW         在 IDLE 优先级类别开始应用程序
        NORMAL      在 NORMAL 优先级类别开始应用程序
        HIGH        在 HIGH 优先级类别开始应用程序
        REALTIME    在 REALTIME 优先级类别开始应用程序
        ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
        BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
        WAIT        启动应用程序并等候它结束
        command/program
                    如果是内部 cmd 命令或批文件,那么该命令处理器是
                    用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在
                    后仍然存在。                如果不是内部 cmd 命令或批文件,则是一个程序,并
                    作为窗口应用程序或控制台应用程序运行。    parameters  这些为传送到命令/程序的参数
    如果命令扩展被启用,通过命令行或 START 命令的外部命令
    调用会如下改变:将文件名作为命令键入,非可执行文件可以通过文件关联调用。
        (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
        关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
         FTYPE 命令。执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用
        程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
        则不会发生。如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
        字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
        防止从当前目录提取 CMD.EXE。如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
        PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
        名。PATHEXT 变量的默认值是:        .COM;.EXE;.BAT;.CMD    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
    与目录名相配。如果确实如此,START 会在那个路径上调用
    Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。
      

  7.   

    请注意下面的话:将文件名作为命令键入,非可执行文件可以通过文件关联调用。
        (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。这说明Start.EXE就是搂主需要的!
      

  8.   

    再看一遍楼主的问题:
    请问各位大虾
    如何用vb或delphi程序代码使自己的可执行文件(.EXE)成为打开某种扩展名的文件的默认打开程序
    好象双击*.txt直接用NOTEPAD.EXE打开
    好象双击*.doc直接用word.EXE打开
    好象双击*.mp3直接用winamp.EXE打开
    即只需双击此类文件(扩展名相同)自动用自己的EXE打开
    急,急,急
    重酬,谢了
    我说就是用程序设定或更改指定类型文件的打开方式,你说呢?假如你编了一个记事本,名为:mynote.exe,现在你要求只要双击.txt文件,就用mynote.exe将其打开,在没有更改文件关联的情况下,只用:
    Shell "c:\start.exe c:\001.txt",能调用mynote.exe打开c:\001.txt吗?
      

  9.   

    请注意下面的话:将文件名作为命令键入,非可执行文件可以通过文件关联调用。
        (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
    呵呵,没设定文件关联怎么通过文件关联调用?
      

  10.   

    想请问一下rainstormmaster(rainstormmaster)
    假如我编了一个记事本,名为:mynote.exe,现在你要求只要双击.txt文件,就用mynote.exe将其打开,
    我怎样在MYNOTE.EXE中获取文件的完全路径
    是自动获取吗?
    解答完就结!
      

  11.   

    或者说怎样把*.txt的内容load到mynote.exe的文本框(之类)中去?
      

  12.   

    看来是我没看清楚。
    不过即使是修改文件关联在WinNT下也可以简单地用命令提示行完成,用Assoc命令和Ftype命令。不过好像Win9X下没有相关的外部命令,所以还是用编成直接修改系统注册表吧。下面回答“我怎样在MYNOTE.EXE中获取文件的完全路径”
    一旦建立了文件关联,在VB中就可以通过Command参数获取,当双击非可执行文件并关联到你的程序时,系统就会把该文件的路径和文件名传递给程序的Command参数,这是自动的。
    下面的代码供您参考,直接放在窗体的Load事件过程中
    dim n
    If Command = "" Then
    msgbox "直接打开程序,应该自动新建一个文档"
      '这里填写新建文档的过程
    Else
        If Mid(Command, 1, 1) = Chr(34) Then
           n = Mid(Command, 2, Len(Command) - 2)
        Else
           n = Command
        End If
    '去掉可能存在的Command参数中的引号,确保正确
    msgbox "试图打开的文件为:"+n
    '填写用于打开文件n的代码
    End If
    注意当,允许返回命令行开关时和其他参数时,还需要对Command进行字符串处理。
      

  13.   

    或者说怎样把*.txt的内容load到mynote.exe的文本框(之类)中去?
    dim n
    If Command = "" Then
    msgbox "直接打开程序,应该自动新建一个文档"
      '这里填写新建文档的过程
    Else
        If Mid(Command, 1, 1) = Chr(34) Then
           n = Mid(Command, 2, Len(Command) - 2)
        Else
           n = Command
        End If
    '去掉可能存在的Command参数中的引号,确保正确
    msgbox "试图打开的文件为:"+n
    '填写用于打开文件n的代码
        Open n For Input As #1
        On Error GoTo 0   ' 关闭错误陷阱。
        EOF (1)
        On Error GoTo l1
        Text1.text = StrConv(InputB(LOF(1), 1), vbUnicode)
        On Error GoTo 0   ' 关闭错误陷阱。
        Close #1
    goto l2
        L1:msgbox "无法打开指定的文件"+n
    L2:
    End If
      

  14.   

    根据扩展名做一下判断,调用相应程序就行了,楼主的意思--
    str = Right(Trim(FileName), 3)
    Select Case str
     Case "txt"
       Shell "\notepad.exe " + "filename"
     Case "doc"
       Shell "winword.exe " + "filename"
     case --
     
    End Select
      

  15.   

    想请问一下rainstormmaster(rainstormmaster)
    假如我编了一个记事本,名为:mynote.exe,现在你要求只要双击.txt文件,就用mynote.exe将其打开,
    我怎样在MYNOTE.EXE中获取文件的完全路径
    是自动获取吗?
    看capricciososoft(随想软件) 上面的回答
      

  16.   

    使用command函数
    你双击c:\a.txt
    那么dim a as string 
    a=command
    msgbox a显示为c:\a.txt