在Windows95/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.0IDE中,新建工程Project1,在Form1上添加命令按钮Command1。 2、选择菜单“工程”—“添加模块”—“模块”—“打开”,在Project1中添加模块Moudle1。 3、在Moudle1“通用—声明”部分声明API函数和常量。 ConstREG_SZ=1 GlobalConstHKEY_CLASSES_ROOT=&H80000000 DeclareFunctionOSRegQueryValueExLib“advapi32”Alias“RegQueryValueExA”(ByValhKeyAsLong,ByVallpszValueNameAsString, ByValdwReservedAsLong,lpdwTypeAsLong,lpbDataAsAny,cbDataAsLong)AsLong DeclareFunctionOSRegOpenKeyLib“advapi32”Alias“RegOpenKeyA”(ByValhKeyAsLong,ByVallpszSubKeyAsString,phkResultAsLong)AsLong DeclareFunctionOSRegSetValueExLib“advapi32”Alias“RegSetValueExA”(ByValhKeyAsLong,ByVallpszValueNameAsString, ByValdwReservedAsLong,ByValfdwTypeAsLong,lpbDataAsAny,ByValcbDataAsLong)AsLong DeclareFunctionOSRegCloseKeyLib“advapi32”Alias“RegCloseKey”(ByValhKeyAsLong)AsLong 4、在Moudle1中编写函数。 FunctionRegOpenKey(ByValhKeyAsLong,ByVallpszSubKeyAsString, phkResultAsLong)AsBoolean DimlResultAsLong OnErrorGoTo0`关闭错误陷阱 lResult=OSRegOpenKey(hKey,lpszSubKey,phkResult) IflResult=0Then RegOpenKey=True Else RegOpenKey=False EndIf EndFunction FunctionRegSetStringValue(ByValhKeyAsLong,ByValstrValueNameAsString, ByValstrDataAsString,OptionalByValfLog)AsBoolean DimlResultAsLong OnErrorGoTo0 lResult=OSRegSetValueEx(hKey,strValueName,0&,REG_SZ,ByValstrData, LenB(StrConv(strData,vbFromUnicode))+1) IflResult=0Then RegSetStringValue=True Else RegSetStringValue=False EndIf EndFunction FunctionStripTerminator(ByValstrStringAsString)AsString DimintZeroPosAsInteger intZeroPos=InStr(strString,Chr$(0)) IfintZeroPos>0Then StripTerminator=Left$(strString,intZeroPos-1) Else StripTerminator=strString EndIf EndFunction FunctionRegQueryStringValue(ByValhKeyAsLong,ByValstrValueNameAsString, strDataAsString)AsBoolean DimlResultAsLong DimlValueTypeAsLong DimstrBufAsString DimlDataBufSizeAsLong RegQueryStringValue=False OnErrorGoTo0 lResult=OSRegQueryValueEx(hKey,strValueName,0&,lValueType,ByVal0&, lDataBufSize) IflResult=ERROR_SUCCESSThen IflValueType=REG_SZThen strBuf=String(lDataBufSize,“”) lResult=OSRegQueryValueEx(hKey,strValueName,0&,0&,ByValstrBuf, lDataBufSize) IflResult=ERROR_SUCCESSThen RegQueryStringValue=True strData=StripTerminator(strBuf) EndIf EndIf EndIf EndFunction 5、双击Command1,编写Click事件代码。 PrivateSubCommand1_Click() DimhKeyAsLong DimMyReturnAsLong DimMyDataAsString 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.exe1%”,False) IfMyReturnThen MsgBox“改变文件打开方式成功!”,vbInformation,“请注意” Else MsgBox“改变文件打开方式失败!”,vbExclamation,“请注意” EndIf OSRegCloseKey(hKey) EndSub 6、按F5运行程序,在简体中文Windows95/NT/98、VB5.0/6.0环境中调试通过。 ㈡利用Delphi编程 1、在Delphi3.0IDE中,新建工程Project1,在Form1上添加按钮Button1。 2、在uses子句中添加Registry。 3、双击Button1,编写Click事件代码。 procedureTForm1.Button1Click(Sender:Tobject); var MyRegistry:TRegINIFile; Return:string; begin try MyRegistry:=TRegINIFile.Create(``); MyRegistry.RootKey:=HKEY_CLASSES_ROOT; Return:=MyRegistry.ReadString(`.gid`,``,`No!NotFoundtheKey!`); 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环境中调试通过。->
|