Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Waitforsingleobject

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.08.2003, 19:36 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Grüble schon eine gute Stunde über folgende Problematik:
Ich habe zwei Routinen in welchen eigentlich selbiges geschieht(der Aufruf von Calc.exe ist hier nur der Demo wegen), aber die Ergebnisse anders ausfallen.
Variante 1:

C++:
void CMySetupDlg::OnStartFakeSetup()
{
    STARTUPINFO         siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;

    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));

    siStartupInfo.cb = sizeof(siStartupInfo);

    if(CreateProcess("c:\\Windows\\system32\\notepad.exe",    
                     " example.txt",                
                     0,
                     0,
                     FALSE,
                     CREATE_DEFAULT_ERROR_MODE,
                     0,
                     0,                              
                     &siStartupInfo,
                     &piProcessInfo)){
        WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
        CreateProcess("c:\\Windows\\system32\\calc.exe",    
                     " example.txt",                
                     0,
                     0,
                     FALSE,
                     CREATE_DEFAULT_ERROR_MODE,
                     0,
                     0,                              
                     &siStartupInfo,
                     &piProcessInfo);
        ::CloseHandle(piProcessInfo.hThread);
        ::CloseHandle(piProcessInfo.hProcess);
    }        
}


Beim Testen der Routine funktioniert alles wie gewünscht, WaitForSingleObject() macht das was es soll - es wartet.
Variante 2.

C++:
void CMySetupDlg::OnStartSetup()
{
    STARTUPINFO         siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;

    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));

    siStartupInfo.cb = sizeof(siStartupInfo);

    if(CreateProcess("Z:\\DISK1\\setup.exe",    
                     0,                
                     0,
                     0,
                     FALSE,
                     CREATE_DEFAULT_ERROR_MODE,
                     0,
                     0,                              
                     &siStartupInfo,
                     &piProcessInfo)){
        WaitForSingleObject(piProcessInfo.hProcess, INFINITE);
        CreateProcess("c:\\Windows\\system32\\calc.exe",    
                     " example.txt",                
                     0,
                     0,
                     FALSE,
                     CREATE_DEFAULT_ERROR_MODE,
                     0,
                     0,                              
                     &siStartupInfo,
                     &piProcessInfo);
        ::CloseHandle(piProcessInfo.hThread);
        ::CloseHandle(piProcessInfo.hProcess);
    }
}


setup.exe ist ein InstallShield Setup, welches von meiner Routine aufgerufen wird. Hier aber steigt WaitForSingleObject() nach Start der setup.exe aus.
Warum?
Könnte hier zwar eine Hardcore Methode schreiben, aber das wäre unschön :)
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2003, 21:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi Uwe,
ich find das schon ziemlich hardcore
Wenn ich dich richtig verstanden habe wartet der Waitforsingleobject nicht. Obwohl du das willst

Vielleicht geht ja sowas in der art

C++:
DWORD dw;
do{
GetExitCodeProcess(piProcessInfo.hProcess,&dw);
}
while(dw==STILL_ACTIVE);



Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2003, 21:52 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Heiko,
Dein Gedanke ist keineswegs falsch, aber auch nicht der Bringer. Das liegt aber am InstallShield selbst, der beendet nämlich einen Prozeß wenn dieser den MSInstaller bemüht. Dann ist im ProzessViewer bzw. in Spy++ die ProzeßID ungültig.
Muß ich halt anders an die Sache rangehen. Aber erst morgen... Jetzt bereite ich mich auf die vorausgesagte Kältewelle vor und trinke ein Radeberger
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 13.08.2003 um 21:53 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.08.2003, 22:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Dann würde ich so vorgehen
erstellen einer liste der aktuellen Prozesse.
Dann aufruf und vergleich welche dazugekommen sind
von den neuen mit open den handle holen und für alle neuen Processe waitforsingleobject machen

Wenn du weisst wie der neue Prozess den setup.exe startet gehts vielleicht so


C++:
proc.dwSize = sizeof(proc);
hSysSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
Process32First(hSysSnapshot,&proc);
proc.dwSize = sizeof(proc);

do{
if(!strcmp(proc.szExeFile,"blabla.exe")){
h_proc=OpenProcess(PROCESS_ALL_ACCESS, TRUE, proc.th32ProcessID);
WaitForSingleObject(h_proc, INFINITE);
}while(Process32Next(hSysSnapshot,&proc));





Ansonten Prost
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.08.2003 um 22:43 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.08.2003, 23:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hey Uwe,
zeigst dir mir mal deine Hardcorelösung dazu.
Will mal sehen wie man sowas professionell löst

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.08.2003, 20:29 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Heiko,
wenn's fertig ist - ja. War mal paar Tage weg und bin noch nicht weiter gekommen bzw. hab noch nicht weiter gemacht.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 17.08.2003 um 20:29 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.08.2003, 22:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ok danke,
mach dir kein Stress.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: