Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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
Geschrieben

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};

Geschrieben

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...

Geschrieben
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).
Geschrieben

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

B)

Um die Priorität deines Processes zu ändern benötigst du - wie mein Vorredner schon dachte - CreateProcess

Geschrieben

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.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...