Hilfe zur Scripten



  • Hallo

    Ich bastle schon seit einiger zeit an einem Programm zum Codieren von Videos. Das Codieren realisiere ich einfacheitshalber über ein Script von Windows Media Encoder.

    Ich benutze volgenden Code:

    WinExec("cmd.exe /c cscript.exe C:\\WINDOWS\\system32\\wmcmd.vbs -input e:\\-=Photos=-\\PIC_0055.AVI -output c:\\meinedatei.wmv ",SW_SHOW);
    

    Meine Fragen dazu:

    Wie kann ich feststellen wann das Script mit Codierung fertig ist, bzw. gibt die Funktion irgendein Wert zurück wenn es fertig ist?

    Wie lass ich mehrere Scripten nach einander ausführen. (Die Dos-Fenster springen alle gleichzeitig auf)?

    und schließlich

    wie kann man das ganze im Hintergrund ablaufen lassen(das Dos-Fenster soll nicht aufgehen)?

    Würde mich über Hilfe sehr freuen.

    Gruß Salfador



  • Salfador schrieb:

    Meine Fragen dazu:

    Wie kann ich feststellen wann das Script mit Codierung fertig ist, bzw. gibt die Funktion irgendein Wert zurück wenn es fertig ist?

    Wie lass ich mehrere Scripten nach einander ausführen. (Die Dos-Fenster springen alle gleichzeitig auf)?

    eine direkte möglichkeit gibt es nicht, denn WinExec+SW_SHOW ist dann fertig, wenn das programm cmd.exe aufgerufen wurde.
    mir fallen nur unsaubere lösungen für dieses problem ein.

    Salfador schrieb:

    und schließlich

    wie kann man das ganze im Hintergrund ablaufen lassen(das Dos-Fenster soll nicht aufgehen)?

    wenn du den cmd interpreter startest, dann wird er auch geladen. es ist nun mal eine konsolenanwendung.
    habe gerade noch mal in der msdn nachgelesen. vielleicht bin ich zu müde, aber da steht auch keine wahre lösung drin.
    einen anderen int nCmdShow flag als SW_SHOW zu setzen löst dein problem nicht. kannst höchstens versuchen auf CreateProcess (s. MSDN) anstatt auf WinExec zuzugreifen.



  • Danke für den Tip mit CreateProzess. Die erstem beiden fragen haben sich somit erledigt. Nur wie ich es im Hintergrund laufen lassen kann weis ich nicht



  • ...CreateProcess ist Dein Freund.

    Mit ShellExecute hättest Du noch die Möglichkeit mit Parameter SW_HIDE die Anwendung unsichtbar ablaufen zu lassen, aber auch ShellExecute kehrt sofort zurück. Es gibt glaube ich noch ShellExecuteEx, da musst Du mal im MSDN nachsehen.

    Die beste Möglichkeit ist jedoch CreateProcess.
    Dort hast Du mit einem Process- u. Threadhandle die Möglichkeit auf den neuen Prozess zuzugreifen und zu warten:

    STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	DWORD dwExitCode = -1;
    	TCHAR cPath[MAX_PATH];
    	memset(&si, 0, sizeof(si));
    	si.cb = sizeof(si);
    	memset(&pi, 0, sizeof(pi));
    	lstrcpy(cPath, pstrCmdLine);
    	BOOL bSuccess = CreateProcess(NULL, cPath, NULL, NULL, FALSE, 
    			CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, pstrCurrDir, &si, &pi);
    	if (bSuccess)
    	{
    		if (!CloseHandle(pi.hThread))
    			return FALSE;
    		switch(WaitForSingleObject(pi.hProcess, dwWaitSeconds * 1000))
    		{
    			case WAIT_OBJECT_0:
    				bSuccess = GetExitCodeProcess(pi.hProcess, &dwExitCode);
    				break;
    			case WAIT_TIMEOUT:
    				break;
    			default:
    				break;
    		}
    		if (bSuccess)
    			bSuccess = CloseHandle(pi.hProcess);
    		else
    			CloseHandle(pi.hProcess);
    	}
    	return bSuccess && !dwExitCode;
    

Anmelden zum Antworten