2009-11-18 5 views
0
Win.ShellExecute 0, "open", "C:\dir\program.exe", "arguments", vbNullString, SW_SHOWNORMAL 
Win.ShellExecute 0, "open", "http://www.google.com", vbNullString, vbNullString, SW_SHOWNORMAL 

program.exe의 실행 여부에 관계없이 google.com을 열도록합니다. 이 문제를 어떻게 해결할 수 있습니까? 차라리 "시작"이라고 부르는 것을 피할 것입니다.windows가 shellexecute 요청을 큐에 저장하지 못하도록 함

이 두 호출은 거의 즉시 발생하며 VB 프로그램은 계속 실행됩니다. 그러나 Vista와 XP 모두에서 google.com은 program.exe가 닫힐 때까지 열리지 않습니다. program.exe가 닫히기 전에 shellexecute을 호출 한 응용 프로그램이 닫히면 program.exe가 닫히면 google.com이 열립니다.

참고 :

내가 지금은 Program.exe 전화 doevents 100ms마다 또는 필요하면 문제를 해결하지만, 분명히이 다소 해킹의 것으로 나타났습니다.

참고 2 : 다음은 program.exe의 구현 예입니다. 예, program.exe를 변경하면이 문제가 해결됩니다 (즉 doevents 통화 추가).

Option Explicit  
Public Sub Main() 
    Do Until False 
     Sleep 100 
    Loop 
End Sub 
+0

첫 번째 매개 변수로 유효한 HWND를 전달하면 어떤 차이가 있습니까? – tyranid

+0

@tyranid : 테스트 애플리케이션은 폼을 사용하지 않습니다. – Brian

+1

그런 다음 아마 문제의 일부일 수 있습니다. program.exe가 사용자 인터페이스를 표시하지 않는다고 가정합니다. – tyranid

답변

0

대신 CreateProcess를 사용해야 할 수도 있습니다.

+0

글쎄, 난 createprocess 시도하고 도움이되지 않았다. – Brian

0

당신이이

같이 보일 사용하는 당신이

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 

코드를 완료 될 때까지 중단해야 할 경우 당신은 프로세스 API를 사용하는 대신에서 ShellExecute

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long 

Private Type PROCESS_INFORMATION 
     hProcess As Long 
     hThread As Long 
     dwProcessId As Long 
     dwThreadId As Long 
End Type 

Private Type STARTUPINFO 
     cb As Long 
     lpReserved As String 
     lpDesktop As String 
     lpTitle As String 
     dwX As Long 
     dwY As Long 
     dwXSize As Long 
     dwYSize As Long 
     dwXCountChars As Long 
     dwYCountChars As Long 
     dwFillAttribute As Long 
     dwFlags As Long 
     wShowWindow As Integer 
     cbReserved2 As Integer 
     lpReserved2 As Long 
     hStdInput As Long 
     hStdOutput As Long 
     hStdError As Long 
End Type 

할 수 있습니다

ReturnValue = CreateProcess(NullString, AppPathString, ByVal 0&, ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, NullString, StartupInformation, ProcessInformation) 
Do While WaitForSingleObject(ProcessInformation.hProcess, 0) <> 0 
    DoEvents 
Loop 
+0

사실, 제 문제는 제가 할 일이 아니라 끝날 때까지 기다리고 싶지 않다는 것입니다. – Brian

+0

그런 다음 WaitforsingleObject를 사용하지 마십시오. Process API를 사용하여 모든 공통 옵션을 배치하기 위해이 기능을 배치했습니다. CreateProcess를 실행하면 다른 응용 프로그램이 실행되고 CreateProcess가 반환됩니다. –

+0

글쎄, 난 createprocess 시도하고 도움이되지 않았다. – Brian

0

내장형 Shell을 사용하여 프로그램을 시작한 적이 있습니까? xe, ShellExecute보다는? (나는 Win.ShellExecute이 같은 이름의 API 호출이라고 가정하고 있습니다. 질문에 선언을 포함 할 수 있습니다.)

또한 응용 프로그램에 양식을 제공하면 문제가 해결 될 수도 있습니다. 양식이없는 VB6 응용 프로그램에서 이상한 행동을했습니다.

+0

@Markj : "실제"앱에는 형식이 있습니다. 이상은 program.exe를 변경하지 않고 문제를 해결하는 것입니다. – Brian

+0

좋습니다.나는 shell32.shell 객체와 shell 함수를 사용하여 시도했다. 전자는 프로그램이 종료 될 때까지 완전히 동일한 블록과 후자를 제안합니다. 이것은 더 나빠집니다. – Brian

+0

테스트 응용 프로그램을 사용하면 양식이 효과가 없습니다. – Brian

관련 문제