PDA

View Full Version : programmino per lanciare un certo file ogni tot tempo


karond
29-10-2014, 14:19
ciao.
ho studiato un minimo di c al primo anno di università ma ora mi ricordo pochissimo...
avrei bisogno un programma in c che dopo averlo eseguito mi esegue un file che si trova ad esempio in C/programmi/....e dopo 10 minuti lo riavvia una seconda volta, e cosi via fin che non viene chiuso.

Io pensavo di usare un ciclo for e i comandi system e sleep, ho provato a mettermi li con devC++ ma mi son accorto che non mi ricordo piu' nulla....qualcuno puo' aiutarmi a scriverlo?

karond
30-10-2014, 17:38
ragazzi dai qualcuno che me lo metta giù, voi ci mettereste 2 secondi...


ah per windows..

Daniels118
31-10-2014, 08:25
Posta il codice che hai realizzato fin ora.

karond
08-11-2014, 16:51
#include <stdio.h>
#include <windows.h>
int main () {
int tot=0;
int n;
for (n = 1; n <= 3; n++){
ShellExecute(NULL, "open","C:\Program Files (x86)\...\MElcld.exe", NULL, NULL, SW_SHOWNORMAL);

//mi dovrebbe aprire 3 volte il file MElcld.exe
//il problema è che questo file, se lo avvio normalmente, lo avvio con un collegamento sul desktop che
//ha come destinazione: "C:\Program Files (x86)\...\MEls32.exe" -x
//questo -x mi frega perchè non so come inserirlo nella funzione ShellExecute

Sleep(5000);
tot+=n;
}
return 0;
}

monte.cristo
08-11-2014, 17:25
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx
Qui trovi la risposta al tuo quesito. ;)
In particolare se hai
HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
);

per il parametro vale questo

lpParameters [in, optional]

Type: LPCTSTR

If lpFile specifies an executable file, this parameter is a pointer to a null-terminated string that specifies the parameters to be passed to the application. The format of this string is determined by the verb that is to be invoked. If lpFile specifies a document file, lpParameters should be NULL.

karond
09-11-2014, 10:07
grazie! quindi facendo cosi dovrebbe funzionare: ShellExecute(NULL, "open","C:\Program Files (x86)\...\MElcld.exe", "-x", NULL, SW_SHOWNORMAL);
Però c'è un problema...


int main () {
int tot=0;
int n;
for (n = 1; n <= 10; n++){
ShellExecute(NULL, "open","C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe", NULL, NULL, SW_SHOWNORMAL);
Sleep(5000);
tot+=n;
}
return 0;
}

per esempio cosi mi dovrebbe aprire acrobat reader 3 volte. Ma niente non funziona.
Però è strano, perchè sul pc dove ho installato windows 8 funziona, su quello dove devo usare il programma e ho installato w7, non va.
Potrebbe essere colpa dell'antivirus (AVAST) ma anche se lo disattivo non funziona.
Un altra cosa che ho notato invece è che questo funziona anche su w7:

int main () {
int tot=0;
int n;
for (n = 1; n <= 10; n++){
ShellExecute(NULL, "open","notepad", NULL, NULL, SW_SHOWNORMAL);
Sleep(5000);
tot+=n;
}
return 0;
}

Mi apre il notepad a ogni ciclo.

Daniels118
09-11-2014, 13:05
L'operazione "open" serve per aprire un file con il programma predefinito, non per aprire il programma.
In generale ShellExecute serve per eseguire un'operazione predefinita su un file (ancora una volta, non per aprire un programma).
Per eseguire un comando generico devi utilizzare la funzione CreateProcess.

karond
09-11-2014, 21:44
int main () {
int tot=0;
int n;
for (n = 1; n <= 10; n++){
CreateProcess
("C:\\Program Files (x86)\\...\\MEls32.exe",
"-k",NULL,NULL,FALSE,
CREATE_NO_WINDOW,
NULL,NULL,
&sInfo,
&pInfo
);
Sleep(5000);
tot+=n;
}
return 0;
}

mi da questo errore:
[Error] 'sInfo' was not declared in this scope
[Error] 'pInfo' was not declared in this scope

Daniels118
10-11-2014, 07:49
Il messaggio di errore è chiarissimo, non hai dichiarato sInfo e pInfo.
Guarda questo esempio: http://daycounter.com/LabBook/Windows-CreateProcess.phtml

karond
11-11-2014, 15:20
Ok ora li ho dichiarati con
PROCESS_INFORMATION pi;
STARTUPINFO si;
e si compila correttamente.
Però quando eseguo mi esce una finestra di errore che mi dice ( impossibile avviare correttamente il l'applicazione. Fare click su ok per chiudere l'applicazione.

Daniels118
11-11-2014, 15:32
Devi anche inizializzarli come nell'esempio che ti ho indicato.

karond
12-11-2014, 18:49
Ok adesso funziona,ma il problema è che sembra che non viene lanciato con il "-x"
E' corretto compilare la funzione in sto modo?


CreateProcess
("C:\\Program Files (x86)\\...\\MEls32.exe","-x",NULL,NULL,FALSE,
0,
NULL,NULL,
&si,
&pi
)

Daniels118
13-11-2014, 07:50
Tecnicamente è corretto, tuttavia devi tenere in considerazione questa nota:
Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line.
Dovresti dunque scrivere:

CreateProcess(
"C:\\Program Files (x86)\\...\\MEls32.exe",
"\"C:\\Program Files (x86)\\...\\MEls32.exe\" -x",
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi
)

karond
14-11-2014, 17:27
Mi da un errore alla riga dove chiudo la parentesi della funzione...

[Warning] deprecated conversion from string constant to 'LPSTR {aka char*}' [-Wwrite-strings]
[Error] ld returned 1 exit status

Daniels118
14-11-2014, 19:23
lpCommandLine [in, out, optional]
...
this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
...
In altre parole devi copiare la stringa in una variabile e passare quest'ultima come argomento.

karond
15-11-2014, 09:43
non saprei come fare, ma questa è corretta cosi come la hai scritta tu?

CreateProcess(
"C:\\Program Files (x86)\\...\\MEls32.exe",
"\"C:\\Program Files (x86)\\...\\MEls32.exe\" -x",
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi
)

Daniels118
15-11-2014, 10:04
No, è corretta come valori dei parametri, però come ti ho detto nel precedente post il secondo parametro deve essere una variabile.
Puoi fare una cosa del genere:
char buffer[512];
strcpy(buffer, "\"C:\\Program Files (x86)\\...\\MEls32.exe\" -x");
CreateProcess(
"C:\\Program Files (x86)\\...\\MEls32.exe",
buffer,
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi
);

karond
15-11-2014, 13:25
si si avevo capito ma non sapevo come potevo dichiarare la variabile.
Comunque non si compila.

[Error] ld returned 1 exit status

Daniels118
16-11-2014, 08:51
Usi un ide o compili da riga di comando? Che comandi usi per compilare/linkare? Versione del compilatore?

karond
16-11-2014, 20:57
non so come ma ora funziona e forse correttamente, ora dovrei riuscir ad andar avanti da solo.
Ti ringrazio Daniels118. Sei stato veramente gentile...:)