请问各位大虾
如何用vb或delphi程序代码使自己的可执行文件(.EXE)成为打开某种扩展名的文件的默认打开程序
好象双击*.txt直接用NOTEPAD.EXE打开
好象双击*.doc直接用word.EXE打开
好象双击*.mp3直接用winamp.EXE打开
即只需双击此类文件(扩展名相同)自动用自己的EXE打开
急,急,急
重酬,谢了
如何用vb或delphi程序代码使自己的可执行文件(.EXE)成为打开某种扩展名的文件的默认打开程序
好象双击*.txt直接用NOTEPAD.EXE打开
好象双击*.doc直接用word.EXE打开
好象双击*.mp3直接用winamp.EXE打开
即只需双击此类文件(扩展名相同)自动用自己的EXE打开
急,急,急
重酬,谢了
在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环境中调试通过。
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"
Start C:\001.TXT
Exit
然后Shell这个批处理程序,但是没有上面的方法好,因为在Win9X下(也可能是NT,很长时间没用DOS,记不清了)程序退出后会留下DOS窗口。如果你没有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。
(例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。这说明Start.EXE就是搂主需要的!
请问各位大虾
如何用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吗?
(例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
呵呵,没设定文件关联怎么通过文件关联调用?
假如我编了一个记事本,名为:mynote.exe,现在你要求只要双击.txt文件,就用mynote.exe将其打开,
我怎样在MYNOTE.EXE中获取文件的完全路径
是自动获取吗?
解答完就结!
不过即使是修改文件关联在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进行字符串处理。
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
str = Right(Trim(FileName), 3)
Select Case str
Case "txt"
Shell "\notepad.exe " + "filename"
Case "doc"
Shell "winword.exe " + "filename"
case --
End Select
假如我编了一个记事本,名为:mynote.exe,现在你要求只要双击.txt文件,就用mynote.exe将其打开,
我怎样在MYNOTE.EXE中获取文件的完全路径
是自动获取吗?
看capricciososoft(随想软件) 上面的回答
你双击c:\a.txt
那么dim a as string
a=command
msgbox a显示为c:\a.txt