在XP计算机上使用CreateObject时出错91

时间:2013-04-01 16:52:28

标签: vb6 special-folders createobject

我有一个旧的VB6应用程序,我已分发给运行XP,Windows 7和Windows 8的多个用户。以下代码抛出错误91“”对象变量或未设置块变量“。

Const ssfPERSONAL = 46  'set directory to the common Documents folder
Dim strMyDocsPath As String  'stores common docsPath
On Error GoTo ErrorHandler

strMyDocsPath = CreateObject("Shell.Application").NameSpace(ssfPERSONAL).Self.Path

具体来说,最后一行是问题。我希望strMyDocsPath指向用户计算机上的公共文档文件夹。它在Windows 7和Windows 8中运行良好,但在XP机器上除外,它不会顺利运行。

在有问题的计算机上,我尝试重新注册scrrrun.dll并收到一条成功注册的消息。我尝试下载并安装VB6可分发的SP6文件,但仍然得到错误。我搜索了几个论坛,但是无法搞清楚。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在调试此类错误时,在每个行调用一次调用中取消复杂的单行通常很有用:

Dim DebugObj1 As Object
Dim DebugObj2 As Object
Dim DebugObj3 As Object

Set DebugObj1 = CreateObject("Shell.Application")
Debug.Print "1: " & CStr(DebugObj1 Is Nothing)
Set DebugObj2 = DebugObj1.NameSpace(ssfPERSONAL)
Debug.Print "2: " & CStr(DebugObj2 Is Nothing)
Set DebugObj3 = DebugObj2.Self
Debug.Print "3: " & CStr(DebugObj3 Is Nothing)
strMyDocsPath = DebugObj3.Path

Debug.Print strMyDocsPath

之后,更容易发现哪些调用没有返回有用的对象。在您的情况下,很可能是.NameSpace(ssfPERSONAL)

如果禁用共享文档,我能够在Windows XP SP3中重现您的问题。有很多方法可以禁用它们。请参阅此示例,例如:http://www.howtogeek.com/howto/windows/how-to-remove-shared-documents-icon-from-my-computer-in-windows-xp/

作为旁注,ShellSpecialFolderConstants.ssfPersonal实际上是0x05,请参阅MSDN。您使用的46(或0x2e)值CSIDL_COMMON_DOCUMENTS确实会转换为公共文档文件夹,例如C:\Documents and Settings\All Users\Documents。可能使用误导性命名并不是最好的做法。