[ vladaboy93 @ 15.04.2009. 14:04 ] @
Otvorio sam proces sa ShellExecute, on vraca HINSTANCE, potrebno mi je da taj proces koji sam pokrenuo posle nekog vremena ugasim, normalno bi ga ugasio sa

SendMessage(hwnd.., WM_CLOSE, 0, 0); ali ne znam kako bi mpomocu hinstance zatvoriio tu aplikaciju koju sam otvorio?
[ kiklop74 @ 15.04.2009. 14:38 ] @
Nasilno zatvaranje nekog programa se radi sa ovom API funkcijom

TerminateProcess
http://msdn.microsoft.com/en-us/library/ms686714(VS.85).aspx

[ deerbeer @ 15.04.2009. 16:23 ] @
Citat:
vladaboy93: Otvorio sam proces sa ShellExecute, on vraca HINSTANCE, potrebno mi je da taj proces koji sam pokrenuo posle nekog vremena ugasim, normalno bi ga ugasio sa

SendMessage(hwnd.., WM_CLOSE, 0, 0); ali ne znam kako bi mpomocu hinstance zatvoriio tu aplikaciju koju sam otvorio?


Ako ces iz tvog programa regularno da zatvaras proces slanjem WM_CLOSE poruke :
onda koristi CreateProcess f-ju umesto ShellExecute
http://msdn.microsoft.com/en-us/library/ms682425.aspx i primer na :
http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx
A zatim da iskoristis informacije koje dobijes u strukturi PROCESS_INFORMATION dwProcessId
u callback f-ji EnumWindows za enumerisanje otvorenih prozora
Code:

//otvaranje 
PROCESS_INFORMATION pi;
CreateProcess(...., pi, ...);

//zatvaranje procesa 
::EnumWindows(&EnumWindowsProc, pi.dwProcessId);


BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD procid ; 
GetWindowThreadProcessId(hwnd, &procid ) ;
if (procid == (DWORD)param)
{
    SendMessage(hwnd, WM_CLOSE, 0, 0); 
    return FALSE;
}
return TRUE;
}




[ savkic @ 15.04.2009. 19:07 ] @
ProcessHandle možeš dobiti sa ShellExecuteEx, za gašenje prvo pokušaj sa postovanjem WM_CLOSE poruke prozoru, a ako to ne uspe onda koristi TerminateProcess.
[ vladaboy93 @ 16.04.2009. 11:09 ] @


Code:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD procid ; 
GetWindowThreadProcessId(hwnd, &procid ) ;
if (procid == (DWORD)param)
{
    SendMessage(hwnd, WM_CLOSE, 0, 0); 
    return FALSE;
}
return TRUE;
}


int _tmain( int argc, TCHAR *argv[] )
{

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

if(!CreateProcess("C:\\Program Files\\Mozilla Firefox\\firefox.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))

::EnumWindows(&EnumWindowsProc, pi.dwProcessId);

}



ovo neradi, samo mi otvori proces, i nista se nedesi.


probao sam i sa terminate Processom, samo otvori proces i nista se nedesi
Code:



#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

int _tmain( int argc, TCHAR *argv[] )
{

STARTUPINFO sj;
PROCESS_INFORMATION pj;

ZeroMemory( &sj, sizeof(sj) );
sj.cb = sizeof(sj);
ZeroMemory( &pj, sizeof(pj) );

CreateProcess("C:\\Program Files\\Mozilla Firefox\\firefox.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj);

DWORD a;

GetExitCodeProcess(&pj.hProcess, &a);

TerminateProcess(&pj.hProcess,a);

}


probajte da kompajlirate ovo na svojoj mashini...
[ itf @ 16.04.2009. 11:34 ] @
Kad smo već kod ovoga... Kada kreiram proces kako da detektiram kada je on završio, i po mogućnosti da doznam što je povratna vrijednost tog procesa? Jedino znam da pomoću WaitForSingleObject funkcije mogu čekati da on završi, ali tada mi je program koji kreira taj proces nedostupan sve dok ovaj proces ne završi.
[ deerbeer @ 16.04.2009. 12:30 ] @
@vladaboy93
Prvi primer koji si naveo verovatno ti ne radi :
Code:

if(!CreateProcess("C:\\Program Files\\Mozilla Firefox\\firefox.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
 ::EnumWindows(&EnumWindowsProc, pi.dwProcessId);
}

sto znaci ako se proces ne pokrene pozovi f-ju EnumWindows...
A druga stvar je to da ti opet nece raditi jer se prozor za taj proces u tom trenutku jos nije kreirao tako da
EnumWindow ti nece davati njegov handle od prozora (HWND)
Probaj da stavis jedan Sleep i uverices se .
Ovo sa sleep-om i nije bas najsrecnije resenje jer ne znas koliko vremena
treba procesu da se podigne , a to je sve arbitrazno kad su u pitanju razlicite masine (CPU ,RAM itd...)

A drugi primer sa TerminateProcess bi trebalo da ti radi 100%....


Citat:
itf: Kad smo već kod ovoga... Kada kreiram proces kako da detektiram kada je on završio, i po mogućnosti da doznam što je povratna vrijednost tog procesa? Jedino znam da pomoću WaitForSingleObject funkcije mogu čekati da on završi, ali tada mi je program koji kreira taj proces nedostupan sve dok ovaj proces ne završi.


Pokreni proces u odvojenom threadu i sacekaj da se zavrsi sa WaitForSingleObject
Posle toga posalji poruku glavnom threadu da je proces ugasen.
[ vladaboy93 @ 16.04.2009. 17:52 ] @
Ovo radi, osim kada se stavi Delay, a to meni i trebam znaci sa Sleepom neradi, to mi je nekako neobjasnjivo, jel zna neko zasto ovo neradi?


Code:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{

    STARTUPINFO sj;
    PROCESS_INFORMATION pj;
    
    char b[100];

    ZeroMemory( &sj, sizeof(sj) );
    sj.cb = sizeof(sj);
    ZeroMemory( &pj, sizeof(pj) );


    CreateProcess(L"C:\\Program Files\\Mozilla Firefox\\firefox.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj);
    HANDLE blah = OpenProcess(PROCESS_TERMINATE, true, pj.dwProcessId);
    DWORD a;
    Sleep(3000);   //kada se ovo komentuje onda neradi
    GetExitCodeProcess(blah, &a);
    TerminateProcess(blah,a);

}
[ kiklop74 @ 17.04.2009. 17:20 ] @
Citat:
vladaboy93:

Code:

#include <conio.h>



Zasto ovaj heder?

Citat:
vladaboy93:
Code:

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{

STARTUPINFO sj;
PROCESS_INFORMATION pj;

char b[100];

ZeroMemory( &sj, sizeof(sj) );
sj.cb = sizeof(sj);
ZeroMemory( &pj, sizeof(pj) );


Ovo je tipicna greska svih onih koji slepo prepisuju primere iz MSDN-a. Sve ovo moze da se uradi i jednostavnije i vise u maniru c++:

Code:

STARTUPINFO sj = {};
sj.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pj={};
char b[100] = {0};



Citat:
vladaboy93:
Code:

CreateProcess(L"C:\\Program Files\\Mozilla Firefox\\firefox.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj);


Ovde ne proveravas povratnu vrednost funkcije CreateProcess. Takodje pretpostavlja se da je API postavljen da koristi unicode. U ovom slucaju bolje bi bilo staviti _T makro i tako imati mogucnost izbora ansi ili unicode.

Code:

DWORD ret = CreateProcess(_T("C:\\Program Files\\Mozilla Firefox\\firefox.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj);



Citat:
vladaboy93:
Code:

HANDLE blah = OpenProcess(PROCESS_TERMINATE, true, pj.dwProcessId);
DWORD a;
Sleep(3000);   //kada se ovo komentuje onda neradi
GetExitCodeProcess(blah, &a);
TerminateProcess(blah,a);
}



Ovde u stvari treba sacekati da se program inicijalizuje posto pokretanje programa traje neko vreme. Da bi se sacekala inicijalizacija windows programa treba koristiti API WaitForInputIdle npr:

Code:

DWORD ret = WaitForInputIdle(blah,INFINITE);


Tek kada se saceka inicijalizacija programa moze da se primeni TerminateProcess.