【问题标题】:Error 91 using CreateObject on XP machines在 XP 机器上使用 CreateObject 时出现错误 91
【发布时间】:2013-04-03 20:11:57
【问题描述】:

我有一个旧的 VB6 应用程序,已分发给运行 XP、Windows 7 和 Windows 8 的多个用户。以下代码抛出错误 91 ""Object variable or With block variable not set"。

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 文件,但仍然出现错误。我已经搜索了几个论坛,但无法弄清楚。有什么想法吗?

【问题讨论】:

  • 尝试使用中间变量来创建对象,使用 Set 关键字。然后将字符串赋值给字符串变量。
  • Shell 是Windows Explorer,与Scripting Runtime 无关。

标签: vb6 special-folders createobject


【解决方案1】:

在调试此类错误时,以每行一次调用的方式取消集中复杂的单行代码通常很有用:

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 这样的Common Documents 文件夹。使用误导性命名可能不是最佳做法。

【讨论】:

  • 这就是为什么这样的位置不适合程序无人值守使用的原因,即除非允许用户通过保存对话框等导航到那里。
  • 你是正确的, .namespace(ssfPERSONAL) 什么也没返回。但是,共享文档在机器上是完全可见的,并且文件夹设置在我的 XP 机器上看起来完全一样,效果很好。网络上有机器,而我的没有 - 这可能是问题吗?即使我看到它,该文件夹是否仍会被禁用?如果是这样,我该如何启用?我想另一个有助于解决我的问题的问题是:有没有另一种方法可以使用代码来确定用户的“公共文档”文件夹?
  • @JohnMarzion 那么您可以使用 Windows 资源管理器应用程序访问该文件夹吗?有趣的。要找出您的应用程序失败的原因,我会这样做:下载 Process Monitor (technet.microsoft.com/en-us/sysinternals/bb896645.aspx);设置过滤器“进程名称”=“YourApp.exe”;监视注册表和文件系统活动。就我而言,VB 错误之前的最后一个活动是读取此注册表路径:HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoSharedDocuments。
  • @kurniliya:我按照您的建议做了(感谢您的想法),当它尝试访问用户本地设置文件夹时,我收到“拒绝访问”错误。它不是通用文档文件夹,而是特定用户/本地设置/临时/下的临时文件夹。有什么建议吗?
  • @JohnMarzion 我猜这是因为该位置 shell 认为 CSIDL_COMMON_DOCUMENTS 的文件夹。而且您没有权限写入它。可以肯定的是,请检查注册表。如果我没记错的话,位置就像`HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders`。尝试通过 Windows 资源管理器访问该文件夹——我敢打赌你做不到。
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多