在Windows95/NT/98操作系統中改變文件打開方式的問題,又可稱為改變文件類型關聯的問題,即把某類型(擴展名)的文件與某應用程序關聯,例如通常當雙擊*.txt文件時系統自動調用Notepad.exe。本文介紹利用Windows注冊表編輯器Regedit.exe手工或編程改變文件打開方式的方法,並提供程序實例。
一、基本思路:
1、注冊表編輯器Regedit.exe是用於更改系統注冊表設置的高級工具,包含了關於系統配置及運行的重要信息,默認訪問路徑為C:WindowsRegedit.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文件的圖標;shellopencommand,右側顯示欄內“C:WINDOWSNOTEPAD.EXE%1”為打開*.txt文件的應用程序名稱及參數。 改變打開文件方式的方法(例如用VISIO打開*.exc文件):
◆手工:打開系統注冊表,在HKEY_CLASSES_ROOT下找到.exc及另一主鍵名,找到此主鍵,將shellopencommand右側顯示欄內“C:WINDOWSNOTEPAD.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+“shellopencommand”,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+`shellopencommand`,``,`c:visio.exe%1`);
finally
MyRegistry.Free;
end;
ShowMessage(`改變文件打開方式成功!`);
end;
4、按F9運行程序,在簡體中文Windows95/NT/98、Delphi3.0/4.0環境中調試通過。->