2010-10-26 210 views
0

我在寫一個測試註冊表值訪問權的簡單vb6按鈕。vb6:訪問註冊表值

我有以下幾點:

Private Function registry_read(key_path, key_name) as variant 

Dim registry as object 
set registry = CreateObject("WScript.shell") 
registry_read = registry.regread(key_path & key_name) 
End function 

Private Sub Command1_Click() 
MsgBox registry_read("HKEY_LOCAL_MACHINE\SOFTWARE\PROCESS\frmMain_Values\", "Version") 
end Sub 

我有項目菜單 - >參考 並選擇Microsoft WMI腳本V1.1庫中選擇 和Windows腳本宿主對象模型引用

但是我MSGBOX是仍然空白。我沒有檢查註冊表路徑,它是正確的。有任何想法嗎?

在此先感謝。

回答

1

在開發過程中,您需要註釋掉'error resume next'這一行。如果發生錯誤,您將無法看到詳細信息。它可以是not foundaccess denied等。

也有兩種方法來引用一個對象。早期結合即Dim rs as new adobdb.recordset和晚期結合set rs = CreateObject("Adodb.recordset")。第一種方法(早期綁定)迫使你聲明一個引用,第二種方法(後期)不會。兩者都有優點和缺點(即早期綁定更快,提供智能感知,更容易調試等)http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm

+0

是啊我剛剛發現..我得到的錯誤在registry.regread方法 – phill 2010-10-26 15:17:08

+1

什麼是錯誤? – bugtussle 2010-10-26 15:20:17

+1

'Dim rs As ADODB.Recordset:Set rs = CreateObject(「ADODB.Recordset」)'是早期綁定的。'Dim rs As Object:Set rs = new Recordset' is late-bound。 – wqw 2010-10-26 20:24:55

0

@bugtussle雖然您的陳述是正確的,但wqw的陳述也是。無論您使用New關鍵字還是CreateObject,實際上與對象是早期還是晚期無關。重要的是你是否使用註冊類型聲明對象變量。我相信你在文章中正確解釋了這一點。

我還想提一下,你的文章寫得很好,並有很好的信息,但恕我直言,也包含一些小的不準確。您在文章中稱爲「雙接口」的綁定(以及很好的解釋)通常稱爲「vTable」或「非常早期」綁定。 VB6在可能的情況下支持vTable綁定。

現在,正如你所說的,成爲COM類的唯一要求是該類必須實現iUnknown。 「雙接口」僅僅意味着實現iUnknown和iDispatch的COM類:支持後期綁定的COM類必須實現後者。 VB不直接支持沒有實現iDispatch的COM對象(有一些COM類不支持後期綁定,有些在VB中顯然是有問題的);換句話說,VB只支持實現雙接口的COM類。 (但是,有些技巧使用SendMessage的GETOLEINTERFACE消息繞過了需求。)

此外,它並不完全繞過iUnknown,它是iUnknown.QueryInterface()被繞過,而是直接進入虛擬表。當然,仍然調用iUnknown.AddRef()。

關於New vs. CreateObject:VB針對在項目中使用New關鍵字實例化的項目中定義的類有一個優化策略。但是,如果您在項目上下文之外使用某個類,則兩者之間也存在重要差異;這個頁面http://msdn.microsoft.com/en-us/library/Aa241758做了很好的總結。

我很好奇,也知道OP得到了什麼錯誤。 :)