试图从.NET可执行我从VB6

问题描述:

运行我从wihin使用的ShellExecute API调用VB6执行.NET控制台应用程序获得的错误代码:试图从.NET可执行我从VB6

ExitCode = ShellExecute(Me.hWnd, "open", GetAppPath & "\SQL Utilities\" & "DocXferClient.exe", strFlags, vbNull, SW_HIDE) 

内.NET应用程序(DocXFerClient),I发送试图返回一个“错误代码”使用Environment.ExitCode:

Sub Main() 
    BuildConnectionObject() 
    ProcessRequest() 

    Environment.ExitCode = 55 
End Sub 

然而,无论错误代码我尝试返回(在这种情况下,“55”),内VB6则exitCode始终是“42”。我在VB6端,.NET端或两者上做了什么错误?

ShellExecute不返回退出代码。它会逆转成功(值大于32)或失败(32或更低)。人们可以通过读取the documentation或观察ShellExecute在过程退出之前返回它的值这一事实来判断。

强制性雷蒙德陈链接:What can I do with the HINSTANCE returned by the ShellExecute function?


要获取退出代码,使用GetExitCodeProcess

要获取流程句柄,请使用CreateProcess而不是ShellExecute运行您的应用程序。

不要忘记在返回的进程和线程句柄上调用CloseHandle

+0

ShellExecute在VB6程序中被过度使用。在很多情况下,它并没有提供任何仅仅调用Shell()函数所不具备的功能。 – Bob77 2011-03-28 19:51:23

+0

@Bob:你可以'ShellExecute' htm/doc文件。 'Shell'函数只能启动可执行文件。 – wqw 2011-03-29 07:01:17

对于那些在我们先进的时代仍然受VB6影响的人,我想发布一个大体完整的例子。在以下站点给出的代码非常好:http://vbnet.mvps.org/index.html?code/faq/waitforsingleobject2.htm,但是必须将2个示例放在一起才能获得一个工作位,它将等待带壳应用程序退出,而无需进入CPU密集型循环并获取正确的退出代码。

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 

Private Const SYNCHRONIZE = &H100000 
Private Const WAIT_INFINITE = -1& 
Private Const PROCESS_QUERY_INFORMATION = &H400 

ProcessId = Shell("D:\iwCode\dev\proj\appmanager\MoveIniFileUtil\bin\Debug\MoveIniFileUtil.exe 5", vbNormalFocus) 
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE, True, ProcessId) 
dummyRet = WaitForSingleObject(hProcess, WAIT_INFINITE) 
GetExitCodeProcess hProcess, exitCode 
CloseHandle hProcess 
MsgBox exitCode 

在这里,并没有立即对我来说显然最重要的一点是,你必须调用与或运算在一起,得到这个工作的同步,并PROCESS_QUERY_INFORMATION标志的OpenProcess功能。