我有一个旧的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文件,但仍然得到错误。我搜索了几个论坛,但是无法搞清楚。有什么想法吗?
答案 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
。可能使用误导性命名并不是最好的做法。