其原因可以使ShellExecute的失败?(Which reasons could make Sh

2019-07-30 23:02发布

我有打开使用其相关的应用程序文件VB6应用程序:

ShellExecute(0, "open", filename, params, vbNullString, vbNormalFocus)

这完美的作品。

现在我有一个客户(运行XP使用Adobe Reader)使用上述命令谁也无法打开任何PDF文件。 但是,同样的文件,没有任何问题,从Windows资源管理器点击,双击它时被打开。 我还测试了我的机器上的文件名/ -path组合,以排除那些那样的问题。

我在寻找什么,我可以检查,以确保任何提示ShellExecute工作。 或者有什么可以引起的ShellExecute失败这种方式?

Answer 1:

什么是ShellExecute的返回值? 如果是0x0000001f(== 31,这意味着SE_ERR_NOASSOC ),不是根据shellapi.h“没有与给定文件扩展名关联的应用程序。” ,这意味着.pdf文件扩展名的莫名其妙的注册迷路了。 重新安装Adobe阅读器可能的帮助。



Answer 2:

继托马斯的答案 ,以下是可能的返回值一些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. '


Answer 3:

你已经“打开”作为动词,不这样做,用vbNullString作为动词(“开放”是指开放式动词,NULL意味着默认的动词(如果用户还没有设定特定的默认,默认是打开的,如果没有开放的动词该文件类型,ShellExecute的使用它找到的第一个动词))



Answer 4:

看一看你的返回值ShellExecute调用。 从MSDN :

如果函数成功,则返回大于32更大的值。如果函数调用失败,它返回一个错误值,指示失败的原因。 返回值是投作为与16位Windows应用程序的向后兼容性的HINSTANCE。 这是不是一个真正的HINSTANCE,但是。 它只能被转换为int,并与32或下面的下面的错误代码。

0:操作系统内存不足或资源。

ERROR_FILE_NOT_FOUND :指定的文件未找到。

ERROR_PATH_NOT_FOUND :指定的路径找不到

(......)



Answer 5:

而不是使用的ShellExecute,以“执行”的PDF文件,我用的是FindExecutable API:

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


Answer 6:

如果您在使用

CoInitializeEx(NULL, COINIT_MULTITHREADED)

在你的代码,那么你就必须创建一个单独的线程来通过ShellExecute的执行。 查看更多在这里: 从多线程调用公寓壳牌函数和接口



Answer 7:

  1. 卸载并重新安装Acrobat Reader软件。
  2. 在“文件和设置”,改名“用户名”文件夹“usernamex”(你应该尝试不同的管理员用户登录)。
  3. 重新登录用户和它创建了一个新的用户注册一个新的“用户名”文件夹中。
  4. 现在,它应该工作。

您可以从usernamex文件夹中的文件复制到新的用户名文件夹(桌面,文档等)



Answer 8:

我有同样的问题,这是不可能改变的VB6的代码。 所以我必须找到另一种解决方案...

在我的情况下,它是扩展名为“名为.xyz”的文件,但实际上,它是为Microsoft Word文件,就像一个.doc文件。

当双击首次,Windows询问了PROGRAMM打开该文件用。 在此之后,双击运行良好。 但ShellExecute的没有。 问题是,该ShellExecute的执行“右键” - >上的文件“打开”和“打开”并没有在我的名为.xyz文件上下文菜单中存在。 只是有一个“编辑” ...所以给ShellExecute与“编辑”的工作,但不能与“开放”作为第二个参数。

因为我无法改变VB6代码,我打开注册表编辑器使用注册表。 在路径“HKEY_CLASSES_ROOT \ .DOC”的标准值是“Word.Document.8”,在“HKEY_CLASSES_ROOT \名为.xyz”只是有“xyz_auto_file”。 因此,我改变只是该数值到“Word.Document.8”,一切都完美。 现在我有相同的上下文菜单与一个.doc文件,在我的名为.xyz文件,当我用鼠标右键单击。

同时,也是ShellExecute的作品完美...



Answer 9:

我有一个使用动词的现有程序相同的问题open ,而不是NULL调用时ShellExecute的功能。 我能够加入到解决问题open动词像这里所描述使用注册表编辑器,进入.pdf处理程序(我的是在HKEY_CLASSES_ROOT\pdf_auto_file )。 我认为这是有时不加入了Adobe Reader的安装程序中的一个问题open安装过程中动词。

下面是我添加的注册表值的出口:

[HKEY_CLASSES_ROOT\pdf_auto_file\shell\Open\command]
@="\"C:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe\" \"%1\""


Answer 10:

我从W7x64更新到W10公开发布后遇到同样的问题作为已编译的Visual FoxPro 9应用程序中的OP。

我有安装Adobe Acrobat和Adobe Reader的。 改变从阅读器默认.PDF协会Acrobat和...这所有的作品! 与原来的故障变回读卡器(错误代码31 - “没有与给定文件扩展名关联的应用程序。”)。 我就不清楚了,但幸运的是,我不担心。 我太老了关心,并要求所有网站留在W7。

无论是从关联文件浏览器的工作原理



Answer 11:

从调用仅支持ANSII一个命令一个Unicode版本(ShellExecuteW),经历了一个最新版本的Inno Setup的 。 ShellExecuteW工作过一段ANSII字符串参数,但是在这种情况下没有必要的一个,返回2(见下文 )。
由于利益的问题,在任何ANSII或Unicode,创新科技的内部功能ShellExec也失败,代码为5的编制过程中仍然有一个打开的句柄到文件的原因。



Answer 12:

下面是一个转换的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


Answer 13:

试试这个。 你必须PDF文件的任何程序(如Acrobat X)阅读PDF格式的,那么你就可以打开ShellExecute的PDF文件相关联。



文章来源: Which reasons could make ShellExecute fail?