Veröffentlicht 17. November 200618 j Hi, ich rufe ein Programm aus meinem Programm auf und möchte wissen wann es beendet wird. ShellExecute( NULL, "open", csProgramm, csParameter, NULL, SW_HIDE ); Ich habe eine Beispiel in der MSDN gefunden "Wait until a program closes". Aber ich werde daraus überhaupt nicht schlau. Ist wie chinesisch für mich. Denke das hier ist die entscheidende Stelle: Else '// start notepad lngTask = Shell("notepad " & App.Path & "wait.txt", vbNormalFocus) 'Start the task '// get the window's hWnd lNotePadhWnd = GetForegroundWindow '// get a handle on the window pHandle = OpenProcess(SYNCHRONIZE, False, lngTask) 'Get the task handle '// set the status lblStatus.Caption = "Waiting for notepad to close..." lblStatus.Refresh cmdNotepad.Caption = "Close Notepad" Do '// loop until the program closes '// you can pass INFINITE instead of 0 if you wish, and your '// program will 'hang' here until the program is finished lRet = WaitForSingleObject(pHandle, 0) DoEvents Loop While lRet <> 0 '// program closes lblStatus.Caption = "Notepad closed." cmdNotepad.Caption = "Run Notepad" End If Hier der ganze Code: Wait until a program closes - Developer Fusion, the UK developer community - VB, ASP, C#, .NET, PHP and XML tutorials & source code Könnt Ihr mir helfen wie ich das für mein ShellExecute anpassen kann? Was ist denn "lngTask" Für ein Variablentyp? Hoffe Ihr könnts mir etwas erklären... ODER Geht das vielleicht irgendwie mit WaitForSingleObject ? Gruß Filou
17. November 200618 j Wenn du ShellExecuteEx benutzt, kommst du an ein Prozesshandle, auf das du mit WaitForSingleObject warten kannst.
17. November 200618 j Danke für den Tipp! Schau mal, wieso funktioniert das so nicht? SHELLEXECUTEINFO App; App.lpDirectory = csQuellpfad; App.lpFile = "rar.exe"; App.lpParameters = csParameter; App.nShow = SW_HIDE; if(ShellExecuteEx(App)&&App.hProcess!=NULL) { while (bCheck == TRUE) { dWait = WaitForSingleObject(App.hProcess, 1000); if (dWait == WAIT_ABANDONED) { bCheck = FALSE; } Sleep(2000); } } Bekomme die Medlung: Konvertierung des Parameters 1 von 'struct _SHELLEXECUTEINFOA' in 'struct _SHELLEXECUTEINFOA *' nicht moeglich
17. November 200618 j Solltest du nicht inzwischen in der Lage sein, so ein grundlegendes Problem mit Hilfe der Doku und der Fehlermeldung selbst zu lösen :confused: ShellExecuteEx will einen Zeiger auf eine SHELLEXECUTEINFO-Struktur. Das steht in der MSDN Library, und die Fehlermeldung sagt es auch nochmal. Du musst aber auch alle relevanten Member der Struktur mit Werten füllen. fMask, cbSize und lpVerb sind das mindeste. Alles, was du nicht brauchst, solltest du mit 0 initialisieren. Am besten setzt du gleich beim Anlegen alles auf 0: SHELLEXECUTEINFO App = {0};
17. November 200618 j Ok, habs gerade auch gemerkt Kannst Du mir sagen wie ich hProcess initialisieren muss? habe jetz für App.cbSize = 5000; //Len(App); App.fMask = SEE_MASK_INVOKEIDLIST; Stand so in der hilfe, nur dass das Len bei mir unbekannt ist. also hab ich mal ne Zahl genommen zum test...
17. November 200618 j Kannst Du mir sagen wie ich hProcess initialisieren muss?Gar nicht. Steht auch in der MSDN Library. Da steht übrigens auch, dass du SEE_MASK_NOCLOSEPROCESS benutzen musst, damit du überhaupt ein Handle bekommst. Stand so in der hilfe, nur dass das Len bei mir unbekannt ist. also hab ich mal ne Zahl genommen zum test...Da steht doch: Size of the structure, in bytes. Also sizeof(SHELLEXECUTEINFO).
17. November 200618 j PS: Kann ich irgendwie die Prozesspriorität für die Anwendung einstellen, die geöffnet wird?
17. November 200618 j Mit ShellExecute geht das meines Wissens nicht. Dazu brauchst du CreateProcess.
22. November 200618 j A) folgendes ... while (bCheck == TRUE) { dWait = WaitForSingleObject(App.hProcess, 1000); if (dWait == WAIT_ABANDONED) { bCheck = FALSE; } Sleep(2000); } ... könnte noch ersetzt werden durch while (WaitForSingleObject(App.hProcess, INFINITE) != WAIT_OBJECT_0) ; // Process beendet Um die Priorität deines Processes zu ändern benötigst du - wie mein Vorredner schon dachte - CreateProcess
22. November 200618 j Da nicht klar ist, ob es sich um eine reine Konsolenanwendung oder eine Anwendung mit Fenstern handelt, noch ein Hinweis: Sobald Nachrichten verarbeitet werden müssen, darf im nachrichtenverarbeitenden Thread (GUI-Thread) nicht beliebig lange gewartet werden ohne die Nachrichten abzuarbeiten.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.