2011-03-28 1 views
0

에서 운영하는 .NET 실행 파일에서 오류 코드를 얻기 위해 시도 : 닷넷 응용 프로그램 내에서내가에서 ShellExecute API 호출을 사용하여 VB6에 섯에서 .NET 콘솔 응용 프로그램을 실행 내가 VB6

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

(DocXFerClient을), I Environment.ExitCode 사용하여 "에러 코드"를 반환하는 시도 보내 : 나는 (이 경우 "55"에서) 반환하려고 어떤 오류 코드 그러나

Sub Main() 
    BuildConnectionObject() 
    ProcessRequest() 

    Environment.ExitCode = 55 
End Sub 

을, 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를 사용하여 종료 코드를 얻을 수 있습니다.

ShellExecute이 아닌 CreateProcess으로 애플리케이션을 실행하십시오.

CloseHandle을 호출하는 프로세스와 스레드 핸들 모두에서 호출하는 것을 잊지 마십시오.

+0

ShellExecute는 VB6 프로그램에서 남용됩니다. 많은 경우에있어서 그것은 본질적인 Shell() 함수를 호출하지 않는 것만을 제공합니다. – Bob77

+0

@Bob : htm/doc 파일을'ShellExecute' 할 수 있습니다. 'Shell' 함수는 실행 파일 만 시작할 수 있습니다. – wqw

0

아직 고급 예제에서는 VB6에 종속 된 사람들을 위해 대부분 예제를 게시하고 싶습니다. 다음 사이트에서 제공하는 코드는 훌륭합니다 : http://vbnet.mvps.org/index.html?code/faq/waitforsingleobject2.htm,하지만 당신은 CPU 집약적 인 루프를 입력하지 않고 올바른 종료 코드를 얻기 위해 쉘 응용 프로그램이 종료 될 때까지 기다릴 작업 비트를 얻기 위해 함께 2 개의 예제를 넣어야합니다.

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 

나에게 즉시 분명 아니었다 여기서 중요한 비트는이 작업을 얻기 위해 함께 OR로 동기화 및 PROCESS_QUERY_INFORMATION 플래그로 OpenProcess에 함수를 호출해야했다.

관련 문제