我有打开使用其相关的应用程序文件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:
- 卸载并重新安装Acrobat Reader软件。
- 在“文件和设置”,改名“用户名”文件夹“usernamex”(你应该尝试不同的管理员用户登录)。
- 重新登录用户和它创建了一个新的用户注册一个新的“用户名”文件夹中。
- 现在,它应该工作。
您可以从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?