Kleines Programm soll 3 Prozesse starten und einen Splash-Screen anzeigen... Splash-Screen klappt...



  • Hallo Leute...

    ich hab meinen kleinen Ausflug zu anderen GUIs & CO jetzt mal beendet und bin wieder zur WinAPI zurückgegangen.

    Eigentlich ist die Anwendung sehr leicht, aber irgendetwas mache ich wohl einfach falsch... ich bin ein totaler Newbee was C++ angeht, bitte also Nachsicht walten lassen und das Erschießungskommando erstmal nur mit Gummigeschossen schießen lassen 😉

    Das hier ist mein Code:

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include "resources.h"
    
    HINSTANCE hInst;
    LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    
    int deskBreite = GetSystemMetrics(SM_CXSCREEN);
    int deskHoehe = GetSystemMetrics(SM_CYSCREEN);
    int winBreite = 410;
    int winHoehe = 130;
    
    // OpenCommands //
    CHAR *cmd_stop = "xampp_stop.exe";
    CHAR *cmd_start = "xampp_start.exe";
    CHAR *cmd_iexplorer = "start iexplore.exe \"localhost/presenter\"";
    
    // Integer defining how long to wait
    int waitTime = 4000;
    
    int xpos = (int) ((deskBreite/2) - (winBreite/2));
    int ypos = (int) ((deskHoehe/2) - (winHoehe/2));
    
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX  WndCls;
        static char szAppName[] = "Presenter";
        MSG         Msg;
        HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(101));
    
    	hInst       = hInstance;
        WndCls.cbSize        = sizeof(WndCls);
        WndCls.style         = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
        WndCls.lpfnWndProc   = WindProcedure;
        WndCls.cbClsExtra    = 0;
        WndCls.cbWndExtra    = 0;
        WndCls.hInstance     = hInst;
        WndCls.hIcon         = hIcon;
        WndCls.hCursor       = LoadCursor(NULL, IDC_ARROW);
        WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        WndCls.lpszMenuName  = NULL;
        WndCls.lpszClassName = szAppName;
        WndCls.hIconSm       = hIcon;
        RegisterClassEx(&WndCls);
    
        CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                              szAppName,
                              "Presenter is starting...",
                              WS_SYSMENU | WS_VISIBLE,
                              xpos,
                              ypos,
                              winBreite,
                              winHoehe,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);
    
        while( GetMessage(&Msg, NULL, 0, 0) )
        {
            TranslateMessage(&Msg);
            DispatchMessage( &Msg);
        }
    
        return static_cast<int>(Msg.wParam);
    }
    
    LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg,
    			   WPARAM wParam, LPARAM lParam)
    {
        HDC hDC, MemDCBmpImg;
        PAINTSTRUCT Ps;
        HBITMAP bmpImg;
    
        switch(Msg)
        {
    	case WM_DESTROY:
    	    PostQuitMessage(WM_QUIT);
    	    break;
    	case WM_PAINT:
    	    hDC = BeginPaint(hWnd, &Ps);
    
    	    bmpImg = LoadBitmap(hInst, MAKEINTRESOURCE(102));
    	    MemDCBmpImg = CreateCompatibleDC(hDC);
                SelectObject(MemDCBmpImg, bmpImg);
    
    	    BitBlt(hDC, 0, 0, 400, 94, MemDCBmpImg, 0, 0, SRCCOPY);
    
    	    DeleteDC(MemDCBmpImg);
    	    DeleteObject(bmpImg);
    	    EndPaint(hWnd, &Ps);
    
    		// Handles for process and processinfos
        	STARTUPINFO si;
        	PROCESS_INFORMATION pi;
    
        	STARTUPINFO si2;
        	PROCESS_INFORMATION pi2;
    
        	STARTUPINFO si3;
        	PROCESS_INFORMATION pi3;
    
    	printf("Trying to create process xampp_stop!");
        	if(!CreateProcess(NULL, cmd_stop, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){
            	printf("Process xampp_stop could not be created!");
            	return 0;
        	}
    
    	WaitForSingleObject(&pi, waitTime);
        	CloseHandle( pi.hProcess );
        	CloseHandle( pi.hThread );
    
    	printf("Trying to create process xampp_start!");
        	if(!CreateProcess(NULL, cmd_start, NULL, NULL, FALSE, 0, NULL, NULL, &si2, &pi2)){
            	printf("Process xampp_start could not be created!");
            	return 0;
        	}
    
    	WaitForSingleObject(&pi2, waitTime);
        	CloseHandle( pi2.hProcess );
        	CloseHandle( pi2.hThread );
    
    	printf("Trying to create process ie!");
        	if(!CreateProcess(NULL, cmd_iexplorer, NULL, NULL, FALSE, 0, NULL, NULL, &si3, &pi3)){
            	printf("Process ie could not be created!");
            	return 0;
        	} else {
    		printf("ie-Process was created!");
        	}
    
    	WaitForSingleObject(&pi3, waitTime);
        	CloseHandle( pi3.hProcess );
        	CloseHandle( pi3.hThread );
    
    		printf("The Presenter is started...");
    		// Presenter should run... close this.
    		exit(0);
    	break;
    
    	default:
    	    return DefWindowProc(hWnd, Msg, wParam, lParam);
        }
        return 0;
    }
    

    Was ich damit vor habe:
    1.) Zeige einen Splash-Screen mit einem Bild. -> Funzt
    2.) Öffne eine EXE namens "xampp_stop.exe", die im gleichen Verzeichnis liegen wird wie die erzeugte exe. -> Diese schließt einen Xampp, falls dieser geöffnet ist.
    3.) Öffne die EXE namenes "xampp_start.exe", die ebenfalls im gleichen Verzeichnis liegen wird wie die erzeugte exe. -> Diese öffnet den Xampp (wieder).
    4.) Öffne den InternetExplorer und öffne eine bestimmte URL. (die lokal liegt)
    5.) Schließe die Anwendung.

    Wichtig dabei ist, dass der XAMPP ein bißchen Zeit braucht um runter oder hochzufahren und die Anwendung deshalb auf ihn warten muss, bevor der nächste Schritt stattfindet.

    Kompilieren tut das ganze, ich bekomme auch den Splash-Screen angezeigt, leider scheinen die Dateien aber nicht aufgerufen zu werden.

    Als Ausgabe bekomme ich: "Trying to create process xampp_stop!Process xampp_stop could not be created!"... scheint also was mit der Process-Erstellung schiefzulaufen...

    Weiß jemand was ich falsch mache?
    Vielen lieben Dank im Voraus an alle die etwas antworten / versuchen mir zu helfen / helfen!
    *Fuchur*



  • Also, ich hab mir das Ganze nochmal ganz genau angeschaut und habe eine Lösung gefunden... so ganz gefällt Sie mir nicht, aber ich kann damit leben.

    CreateProcess(NULL, cmd_stop, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)
    

    benötigt als ersten Parameter den vollen, absoluten Pfad zur Anwendung...
    zB "C:\\Programme\\Internet Explorer\\iexplorer.exe".

    Der zweite Parameter kann für batch-like Befehle verwendet werden.
    Da muss man also sowas hinschreiben wie "open \"http://www.google.de\"".

    Ohne das open scheint es nicht zu wollen und schreibt man im Parameter1 "open ..." gehts auch nicht...

    Soweit so gut. Hab die Syntax jetzt angepasst und es scheint zu gehen... nur eine Sache krieg ich leider mit dem "open \"http://www.google.de\""-Befehl nicht hin...

    Will man auf den Prozess warten, schaut er jetzt nicht wann der Prozess "iexplorer.exe" geschlossen wird, sondern wann die Seite aufgerufen wurde... d.h. ich kann den Xampp nicht automatisch schließen wenn der IE geschlossen wird... der Aufruf erfolgt viel früher... macht also in dem Zusammenhang keinen Sinn...

    Ich suche gerade nach einer Lösung für dieses Problem...
    *Fuchur*


Anmelden zum Antworten