2010-10-26 159 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得到了什么错误。 :)