2013-04-01 6 views
2

У меня есть старое приложение VB6, которое я распространил для нескольких пользователей, работающих под управлением XP, Windows 7 и Windows 8. Следующий код бросает ошибку «91» «Объектная переменная или с переменной блока набор».Ошибка 91 с использованием CreateObject на компьютерах XP

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 и все еще получить ошибку. Я искал несколько форумов и просто не могу понять. Есть идеи?

+0

Попробуйте использовать промежуточную переменную для создания объекта, используя ключевое слово 'Set'. Затем назначьте строку строковой переменной. – JimmyPena

+1

«Шелл» - это проводник Windows, он не имеет ничего общего с временем выполнения сценариев. – Bob77

ответ

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 (или 0x2e), которое вы используете, равно CSIDL_COMMON_DOCUMENTS, который действительно переводится в папку Common Documents, такую ​​как C:\Documents and Settings\All Users\Documents. Наверное, это не самая лучшая практика использования вводящего в заблуждение наименования.

+2

Именно поэтому такое местоположение не предназначено для автоматического использования программой, т. Е. Если пользователю не разрешено перемещаться туда через диалоговые окна «Сохранить» и т. Д. – Bob77

+0

Вы правы в том, что .namespace (ssfPERSONAL) ничего не вернул. Однако общие документы полностью видны на машине, и настройки папки выглядят одинаково на моей машине XP, которая работает отлично. Там машина в сети, у меня нет - может это проблема? Может ли папка по-прежнему отключена, хотя я ее вижу? Если да, как мне включить? Я предполагаю, что другой вопрос, который поможет решить мою проблему, заключается в следующем: есть ли другой способ использовать код для определения папки «общие документы» пользователей? –

+1

@JohnMarzion Итак, вы можете получить доступ к папке с помощью приложения Windows Explorer? Интересно. Чтобы узнать, почему ваше приложение не работает, я бы сделал следующее: загрузить Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx); установить фильтр «Имя процесса» = «YourApp.exe»; контролировать реестр и активность файловой системы. В моем случае последнее действие перед ошибкой VB - это чтение этого пути реестра: HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer \ NoSharedDocuments. –

 Смежные вопросы

  • Нет связанных вопросов^_^