我有一个旧的 VB6 应用程序,已分发给运行 XP、Windows 7 和 Windows 8 的多个用户。以下代码抛出错误 91““对象变量或未设置 block 变量”。
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 和 8 中运行良好,但在 XP 计算机上则不然,除了 XP 开发计算机,它可以顺利运行。
在有问题的计算机上,我尝试重新注册 scrrrun.dll 并收到一条注册成功的消息。我尝试下载并安装 VB6 可分发 SP6 文件,但仍然出现错误。我搜索了几个论坛,但无法弄清楚。有什么想法吗?
最佳答案
在调试此类错误时,以每行一次调用的方式分解复杂的单行代码通常很有用:
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\所有用户\文档
。使用误导性命名可能不是最佳实践。
关于vb6 - 在 XP 计算机上使用 CreateObject 时出现错误 91,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747651/