2

我有一个旧的 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 和 8 中运行良好,但不能在 XP 机器上运行,除了 XP 开发机器可以顺利运行。

在有问题的计算机上,我尝试重新注册 scrrrun.dll 并收到注册成功的消息。我尝试下载和安装 VB6 可分发 SP6 文件,但仍然出现错误。我已经搜索了几个论坛,但无法弄清楚。有任何想法吗?

4

1 回答 1

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(或0x2eCSIDL_COMMON_DOCUMENTS确实可以转换为 Common Documents 文件夹,例如C:\Documents and Settings\All Users\Documents. 使用误导性命名可能不是最好的做法。

于 2013-04-01T20:34:27.370 回答