2011-03-28 49 views
0

運行我從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端或兩者上做了什麼錯誤?

回答

4

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

0

對於那些在我們先進的時代仍然受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功能。