试图从.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
。
对于那些在我们先进的时代仍然受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功能。
ShellExecute在VB6程序中被过度使用。在很多情况下,它并没有提供任何仅仅调用Shell()函数所不具备的功能。 – Bob77 2011-03-28 19:51:23
@Bob:你可以'ShellExecute' htm/doc文件。 'Shell'函数只能启动可执行文件。 – wqw 2011-03-29 07:01:17