По каким причинам может произойти сбой ShellExecute?

Он может иметь возможность использования в контексте приложения, но гораздо чаще используется для целей отладки. Например, когда вы нажимаете точку останова в среде IDE, гораздо легче читать значимые объекты toString(), чем проверять их члены.

Не существует установленного требования для того, что toString() метод должен делать. По соглашению, чаще всего он укажет вам имя класса и значение соответствующих членов данных. Чаще всего методы toString() автоматически генерируются в IDE.

Опираясь на конкретный вывод из метода toString() или анализируя его внутри программы, это плохая идея. Что бы вы ни делали, не сходите по этому маршруту.

13
задан Daniel Rikowski 29 July 2009 в 00:33
поделиться

8 ответов

Какое значение возвращает ShellExecute? Если это 0x0000001f (== 31, что означает SE_ERR_NOASSOC ), то согласно shellapi.h "Нет приложения, связанного с данное расширение имени файла. ", что означает, что каким-то образом потеряна регистрация расширения файла .pdf. Может помочь переустановка Adobe Reader.

10
ответ дан 1 December 2019 в 19:31
поделиться

Посмотрите на возвращаемое значение вашего вызов ShellExecute . Из MSDN :

Если функция завершается успешно, она возвращает значение больше 32. В случае сбоя функция возвращает значение ошибки, указывающее причину сбоя. Возвращаемое значение приводится как HINSTANCE для обратной совместимости с 16-битными приложениями Windows. Однако это не настоящий ИНСТАНС. Его можно привести только к типу int и сравнить с 32 или следующими ниже кодами ошибок.

0: Операционной системе не хватает памяти или ресурсов.

ERROR_FILE_NOT_FOUND : Указанный файл не найден.

ERROR_PATH_NOT_FOUND : указанный путь не был найден

(...)

3
ответ дан 1 December 2019 в 19:31
поделиться

В дополнение к ответу Томаса , вот некоторые константы VB6 для возможных возвращаемых значений ShellExecute , с возможными объяснениями (я думаю, что изначально взял их со страницы MSDN , раздел возвращаемых значений). Возвращаемое значение 32 или меньше означает, что вызов не удался. Возвращенное конкретное значение указывает, что пошло не так.

Const ERROR_BAD_FORMAT = 11&
Const ERROR_FILE_NOT_FOUND = 2&          
Const ERROR_PATH_NOT_FOUND = 3&          ' The specified path was not found. '
Const SE_ERR_ACCESSDENIED = 5            ' The operating system denied access to the specified file. '
Const SE_ERR_ASSOCINCOMPLETE = 27        ' The file name association is incomplete or invalid. '
Const SE_ERR_DDEBUSY = 30                ' The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed. '
Const SE_ERR_DDEFAIL = 29                ' The DDE transaction failed. '
Const SE_ERR_DDETIMEOUT = 28             ' The DDE transaction could not be completed because the request timed out. '
Const SE_ERR_DLLNOTFOUND = 32            ' The specified dynamic-link library (DLL) was not found. '
Const SE_ERR_FNF = 2                     ' The specified file was not found. '
Const SE_ERR_NOASSOC = 31                ' There is no application associated with the given file name extension. '
Const SE_ERR_OOM = 8                     '  out of memory '
Const SE_ERR_PNF = 3                     '  path not found '
Const SE_ERR_SHARE = 26                  ' A sharing violation occurred. '
9
ответ дан 1 December 2019 в 19:31
поделиться

У вас есть «открыть» в качестве глагола, не делайте этого, используйте vbNullString в качестве глагола («Открыть» означает глагол открытия, NULL означает глагол по умолчанию (если пользователь не установить конкретное значение по умолчанию, по умолчанию открыто, если для этого типа файла нет открытого глагола, ShellExecute использует первый найденный глагол))

5
ответ дан 1 December 2019 в 19:31
поделиться

Вместо использования ShellExecute для «выполнения» файла PDF я использую API FindExecutable:

Private Const ERROR_FILE_NO_ASSOCIATION     As Long = 31
Private Const ERROR_FILE_NOT_FOUND          As Long = 2
Private Const ERROR_PATH_NOT_FOUND          As Long = 3
Private Const ERROR_FILE_SUCCESS            As Long = 32 
Private Const ERROR_BAD_FORMAT              As Long = 11

Private Declare Function FindExecutable Lib "shell32.dll" _
   Alias "FindExecutableA" _
  (ByVal lpFile As String, _
   ByVal lpDirectory As String, _
   ByVal sResult As String) As Long


Private Sub OpenDocument(sFile as string, sPath as string)
     Dim sResult As String
     Dim lSuccess As Long, lPos as long

     sResult = Space$(MAX_PATH)
     lSuccess = FindExecutable(sFile, sPath), sResult)
     Select Case lSuccess
        Case ERROR_FILE_NO_ASSOCIATION
            If Right$(sFile, 3) = "pdf" Then
                MsgBox "You must have a PDF viewer such as Acrobat Reader to view pdf files."
            Else
                MsgBox "There is no registered program to open the selected file." & vbCrLf & sFile
            End If
        Case ERROR_FILE_NOT_FOUND: MsgBox "File not found: " & sFile
        Case ERROR_PATH_NOT_FOUND: MsgBox "Path not found: " & sPath
        Case ERROR_BAD_FORMAT:     MsgBox "Bad format."
        Case Is >= ERROR_FILE_SUCCESS:
           lPos = InStr(sResult, Chr$(0))
           If lPos Then sResult = Left$(sResult, lPos - 1)
           Shell sResult & " " & sPath & sFile, True), vbMaximizedFocus
    End Select

End Sub
3
ответ дан 1 December 2019 в 19:31
поделиться
  1. Удалите и переустановите Acrobat Reader.
  2. В разделе «Документы и настройки» переименуйте папку «username» в «usernamex» (вы должны войти в систему под другим администратором).
  3. Повторно войдите в систему как пользователь, и он создаст новую папку «имя пользователя» с новым реестром пользователей.
  4. Теперь все должно работать.

Вы можете копировать файлы из папки usernamex в папку с новым именем пользователя (Desktop, Documents и т. Д.)

1
ответ дан 1 December 2019 в 19:31
поделиться

Вот функция, которая переводит номера ошибок Windows в текст. Вы можете использовать возвращаемое значение в качестве параметра и получить более понятное сообщение.

Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _
    (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
    ByVal nSize As Long, ByVal Arguments As Any) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Const MAX_PATH = 260

Function TranslateDLLError(ByVal lngErrNum As Long) As String
   Dim sRtrnCode As String * MAX_PATH
   Dim lRet As Long

   On Error GoTo errTranslateDLLError(

   sRtrnCode = Space$(256)
   lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, lngErrNum, 0&, sRtrnCode, Len(sRtrnCode), 0&)
   If lRet > 0 Then
      Translate_DLL_Error = Replace$(Left(sRtrnCode, lRet), vbCrLf, "")
   Else
      Translate_DLL_Error = "Error not found."
   End If

   Exit Function

errTranslateDLLError(:
   TranslateDLLError( = "Unable to translate system error: " & CStr(lngErrNum)

End Function
0
ответ дан 1 December 2019 в 19:31
поделиться

Если вы используете

CoInitializeEx(NULL, COINIT_MULTITHREADED)

в своем коде, вам придется создать отдельный поток для выполнения через ShellExecute. Подробнее см. Здесь: Вызов функций оболочки и Интерфейсы из многопоточной квартиры

1
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: