檔案關聯 (轉)

worldblog發表於2007-12-13
檔案關聯 (轉)[@more@]

如何在 .0中 建立自己的型別
  在中,當我們雙擊一個.txt檔案的時候,“記事本”會自動開啟,並且顯示.txt檔案的內容;當我們將一個.txt檔案拖到“記事本”的圖示上的時候,“記事本”程式也會自動開啟,並且顯示.txt檔案的內容。在Windows中,這種技術稱為“檔案關聯”,是一種非常實用,大大方便操作者的功能。當我們自己設計了一個程式,往往自己的程式需要使用自己定義的檔案才能執行。例如,我曾經設計了一個“填字遊戲”,這個遊戲需要一種“字謎檔案”來支援,如果要玩“填字遊戲”,他們必須首先啟動“填字遊戲”的程式,然後在選單上面選擇“檔案”,然後是“開啟字謎”,接著在“開啟字謎”的對話方塊中選擇一個字謎檔案,最後按下“開始遊戲”才能進行遊戲。我一直在想,能不能簡化這些操作,使用者只要雙擊“字謎檔案”,就能自動完成前期的操作,使用者只要按下“開始遊戲”就能進行遊戲了。可能在VC中這樣的功能很容易實現的,但是VB行不行呢?答案是“完全可以!!!”
  首先,為了簡化說明過程,我們要明確一下任務,現在假設有一個我們自定義的檔案型別 .abc ;還有一個VB程式。當我們雙擊自定義檔案 .abc的圖示,或者我們將圖示拖到程式圖示的時候,我們要求程式能夠自動啟動,同時獲得 .abc檔案的檔名,這樣,就能對這個檔案進一步操作了。(為了說明問題,我們假設,當程式自動執行後將檔名作為窗體的標題,當然,你也能獲得檔名後,用你的程式開啟這個檔案。)
  好了,下面就開始編寫程式了。第一個要解決的問題就是如何用程式將.abc檔案和我們的VB程式“關聯”起來呢?在這裡,我們使用修改“登錄檔”的方法來實現檔案關聯。讓我們先定義一個模組,在模組中定義一些常量和。
(以下常數要使用到的,我會加以說明)
 
Option Explicit
Public Const HKEY_CLASSES_ = &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_D = 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 Long

hKey: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", hKey)  '定義它的操作
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfileshellopen", hKey)  '具體定義操作的名稱
ret = RegCreateKey(HKEY_CLASSES_ROOT, "userfileshellopencommand", hKey) '定義操作的動作
ExePath = App.Path & "" & App.EXEName & ".exe %1"  '獲得VB程式名稱
ret = RegSetValue(HKEY_CLASSES_ROOT, "userfileshellopencommand", 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(),進行檔案的關聯。
  好了,學會後,你就能在程式中使用自定義的檔案了,或許某一天,.的預設開啟方式就是你編寫的器了。

 


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992862/,如需轉載,請註明出處,否則將追究法律責任。

相關文章