vb6 - 在 XP 计算机上使用 CreateObject 时出现错误 91

标签 vb6 special-folders createobject

我有一个旧的 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/

相关文章:

c - 自动化错误 - 存储空间不足,无法处理此命令

error-handling - 运行项目时vb6代码中的错误

sql - 无法使用 vb6 将记录插入 ms access 2007

vba - 读取大文本文件 VB6 中的行数

windows - vb6 中的 CommonAppData

qt - 如何将子项动态附加到具有子项别名的 QML 项

javascript - 在 JavaScript 中进行 Prototype 面向对象编程的最佳方法

windows - 如何捕获 Windows 消息?

windows-vista - Robocopy -/XA :SH - to exclude system, 隐藏目录?

c# - 如何在没有 "Enviroment"的情况下获取 Windows 通用应用程序中某些特殊文件夹的路径