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

Vb6 在XP计算机上使用CreateObject时出现错误91,vb6,special-folders,createobject,Vb6,Special Folders,Createobject,我有一个旧的VB6应用程序,我已经分发给几个运行XP、Windows7和Windows8的用户。以下代码抛出错误91“对象变量或未设置块变量” 具体来说,最后一行是问题所在。我希望strMyDocsPath指向用户计算机上的common documents文件夹。它在Windows 7和8中运行正常,但在XP计算机上运行正常,XP开发计算机除外 在出现问题的计算机上,我尝试重新注册scrrrun.dll,并收到一条消息,该消息已成功注册。我尝试下载并安装VB6可分发SP6文件,但仍然出现错误。我

我有一个旧的VB6应用程序,我已经分发给几个运行XP、Windows7和Windows8的用户。以下代码抛出错误91“对象变量或未设置块变量”

具体来说,最后一行是问题所在。我希望strMyDocsPath指向用户计算机上的common documents文件夹。它在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中重现您的问题。禁用共享文档的方法有很多种。例如,请参见:


作为旁注,
ShellSpecialFolderConstants.ssfPersonal
实际上是
0x05
,请参见。值
46
(或
0x2e
)您使用的是
CSIDL\u COMMON\u DOCUMENTS
,它确实可以转换为COMMON DOCUMENTS文件夹,如
C:\DOCUMENTS and Settings\All Users\DOCUMENTS
。使用误导性命名可能不是最好的做法。

尝试使用中间变量来创建对象,使用
Set
关键字。然后分配string到字符串变量。Shell是Windows资源管理器,它与脚本运行时无关。这正是为什么这样的位置不适合程序无人参与使用的原因,也就是说,除非允许用户通过保存对话框等导航到该位置。您在该名称空间(ssfPERSONAL)中是正确的没有返回任何内容。但是,共享文档在计算机上完全可见,并且文件夹设置在我的XP计算机上看起来完全相同,这非常完美。有一台计算机在网络上,我的计算机不是-这可能是问题吗?即使我看到它,文件夹是否仍然被禁用?如果是,我如何启用?我猜另一个问题是有助于解决我的问题的是:是否有其他方法可以使用代码确定用户的“common documents”文件夹?@JohnMarzion以便您能够使用Windows资源管理器应用程序访问该文件夹?很有趣。要了解应用程序失败的原因,请执行以下操作:下载进程监视器();设置筛选器“Process Name”=“YourApp.exe”"; 监视注册表和文件系统活动。在我的例子中,VB错误之前的最后一个活动是读取此注册表路径:HKCU\Software\Microsoft\Windows\CurrentVersion\Policys\Explorer\NoSharedDocuments。@kurniliya:我按照你的建议做了(感谢你的想法),当它试图访问用户本地设置文件夹时,我遇到了“拒绝访问”错误。它不是公共文档文件夹,而是特定用户/本地设置/temp/下的临时文件夹。有什么建议吗?@JohnMarzion我猜那是因为该位置是shell认为的
CSIDL\u COMMON\u文档
的文件夹。并且您没有对其进行访问写入。当然,请检查注册表。如果我的内存很好,那么位置如下所示:“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell文件夹”。尝试通过Windows资源管理器访问所述文件夹--我打赌您将无法访问。
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