PDA

View Full Version : [C++] ShellExecute


deggungombo
11-07-2007, 06:34
ciao a tutti,
devo realizzare un codice che sia in grado di lanciare e terminare un programma non scritto da me (dovrà girare per 5 minuti, ma questo è un problema successivo).

ho letto in giro, e mi sembra d'aver capito, che sia possibile lanciare un applicazione usando ShellExecute.
mi sto allenando con degli esempi trovati in rete ma non riesco assolutamente a compilare nulla di quanto ho trovato (uso dev c++).

non sono un programmatore esperto, ho mosso i miei primi passi con c++ solo 2 mesi fa, quindi non abbiate paura di essere banali nelle vostre spiegazioni.


sto provando il seguente esempio (aprire una pagina web) ma non c'è verso di compilare. dove sbaglio?
#include <iostream>
#include <windows.h>
#include <shellapi.h>
using namespace std;

int main ()

{

ShellExecute ( Handle,"open","http://www.google.com",NULL,NULL,SW_NORMAL);

return 0;
}

ciao e grazie :)

kk3z
11-07-2007, 07:51
E l'errore è?
Handle da quanto vedo non è definito...

misterx
11-07-2007, 07:53
anzichè handle puoi mettere 0

deggungombo
11-07-2007, 08:47
vi amo!!! :D :D :D

è brutto doversi mettere a fare qualcosa senza avere documentazione e le basi adeguate, cmq sono contento di imparare nuove cose.

ok, ho sostituito l'apertura della pagina web con il percorso di un programma scritto da terze parti. supponiamo che il programma, una volta lanciato, giri indefinitamente per sempre.
come lo termino? (anche brutalmente)

ecco l'idea che sto usando per far girare ciao.exe per un tempo definito dall'utente, ma mi manca il comando per terminare il programma. (ho trovato questa (http://www.hwupgrade.it/forum/showthread.php?p=17852353) discussione ma non riesco a capire come si usa system())


#include <stdio.h>
#include <time.h>
#include <iostream>
//#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>

using namespace std;

void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}

int main ()
{
int n,i;
cout<<"How long do you want to run Ciao.exe? (seconds)"<<endl;
cin>>n;


ShellExecute ( 0,"open","c:\\ciao.exe",NULL,NULL,SW_NORMAL);


printf ("Starting countdown...\n");
for (i=n; i>0; i--)
{
printf ("%d\n",i);
wait (1);
}
printf ("Exit\n");


//dovrei inserire qui il comando per terminare ciao.exe

return 0;
}

grazie :)

andbin
11-07-2007, 12:19
Ecco un esempio:
#include <windows.h>
#include <stdio.h>

int main (void)
{
SHELLEXECUTEINFO shexi;
int iSeconds = 30;
DWORD dwRet;

ZeroMemory (&shexi, sizeof (shexi));

shexi.cbSize = sizeof (shexi);
shexi.fMask = SEE_MASK_NOCLOSEPROCESS;
shexi.lpVerb = "open";
shexi.lpFile = "C:\\pippo.exe";
shexi.nShow = SW_NORMAL;

if (ShellExecuteEx (&shexi))
{
do {
printf ("Attesa %d secondi\n", iSeconds);

dwRet = WaitForSingleObject (shexi.hProcess, 1000); // Timeout 1 secondo

if (dwRet == WAIT_TIMEOUT)
iSeconds--;
} while (dwRet != WAIT_OBJECT_0 && iSeconds > 0);

if (dwRet == WAIT_TIMEOUT)
TerminateProcess (shexi.hProcess, 0);

printf ("Terminato");

CloseHandle (shexi.hProcess);
}

return 0;
}

deggungombo
12-07-2007, 02:19
grazie mille, anche se ancora non l'ho capito benissmo funziona alla perfezione :)
era proprio quello che cercavo.

giusto per sfizio sapete se esiste un comando per terminare il processo che possa aggiungere al codice che ho scritto nel mio post precedente?


grazie :)