Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ShellExecute() pitanja...

[es] :: C/C++ programiranje :: ShellExecute() pitanja...

[ Pregleda: 1996 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
217.24.20.*

Sajt: vladimirmakaric.110mb.com


Profil

icon ShellExecute() pitanja...15.04.2009. u 14:04 - pre 182 meseci
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?
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: ShellExecute() pitanja...15.04.2009. u 14:38 - pre 182 meseci
Nasilno zatvaranje nekog programa se radi sa ovom API funkcijom

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


Tko leti vrijedi
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
79.175.79.*



+395 Profil

icon Re: ShellExecute() pitanja...15.04.2009. u 16:23 - pre 182 meseci
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;
}





Viva lollapalooza
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: ShellExecute() pitanja...15.04.2009. u 19:07 - pre 182 meseci
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.
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
217.24.20.*

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: ShellExecute() pitanja...16.04.2009. u 11:09 - pre 182 meseci


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...
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ShellExecute() pitanja...16.04.2009. u 11:34 - pre 182 meseci
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.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: ShellExecute() pitanja...16.04.2009. u 12:30 - pre 182 meseci
@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.

Viva lollapalooza
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
93.86.32.*

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: ShellExecute() pitanja...16.04.2009. u 17:52 - pre 182 meseci
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);

}
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: ShellExecute() pitanja...17.04.2009. u 17:20 - pre 181 meseci
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.


Tko leti vrijedi
 
Odgovor na temu

[es] :: C/C++ programiranje :: ShellExecute() pitanja...

[ Pregleda: 1996 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.