|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 19
|
[C] avviare un nuovo processo con win7
Buongiorno a tutti
![]() il mio problema è il seguente: ho guardato a questo indirizzo per come creare un nuovo processo in windows usando il C. Il listato è questo Codice:
#include <windows.h> int main() { STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInformation; ZeroMemory( &StartupInfo, sizeof(StartupInfo) ); StartupInfo.cb = sizeof(StartupInfo); ZeroMemory( &ProcessInformation, sizeof(ProcessInformation) ); LPWSTR comando = L"del ciao"; CreateProcess ( NULL, comando, NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInformation ); CloseHandle ( ProcessInformation.hProcess ); CloseHandle ( ProcessInformation.hThread ); return 0; } Eccezione non gestita in 0x76DCB733 (kernel32.dll) in ConsoleApplication1.exe: 0xC0000005: violazione di accesso durante la scrittura del percorso 0x0115585E. dove sbaglio? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Prova a cambiare
LPWSTR comando = L"del ciao"; in WCHAR comando[] = L"del ciao"; |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 19
|
non so come hai fatto però abbiamo risolto il problema, grazie mille!
![]() ora però non mi esegue il comando del (che era quello che mi ero preposto di fare) ![]() invece se provo i comandi cmd e help funziona (?) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
del è un comando interno dell'interprete DOS e non un eseguibile. E' il cmd.exe che devi lanciare per eseguire il del.
Ma non capisco perché tutto questo casino per cancellare un file quando esistono le funzioni apposite ... Ultima modifica di lorenzo001 : 21-01-2014 alle 21:01. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
LPWSTR comando = L"del ciao"; è un WCHAR* e non è null terminated, mentre agli array di char inizializzati con una stringa viene silenziosamente aggiunto il carattere '\0' alla fine. Se scrivi LPWSTR comando = L"del ciao\0"; dovrebbe funzionare. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Quote:
Quella stringa è regolarmente terminata. Ci pensa il compilatore ad aggiungere il NULL. Il problema deriva dal fatto che la funzione CreateProcessW ha la necessità di variare il valore della stringa. Quando la funzione tenta di farlo, dato che la LPWSTR è una costante e quindi allocata nel "testo" del codice, avviene la violazione di accesso. Usando invece un vettore regolarmente allocato in memoria, la funzione lavora correttamente. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Eh, c'è scritto a caratteri cubitali
![]() http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx Quote:
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Perché la funzione A accetta una stringa ANSI, la converte in Unicode in un'area allocata dinamicamente e la passa alla funzione W, quindi la funzione W riceve sempre una stringa allocata dinamicamente, mentre la stringa originale non viene modificata.
|
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 19
|
cavoli, la sapete lunga
![]() allora ho provato a dare da riga di comando Codice:
cmd del C:\Users\user\ciao.txt Codice:
start del C:\Users\user\ciao.txt il problema è che se modifico il sorgente in questo modo Codice:
WCHAR comando[] = L"start del C:\\Users\\user\\ciao.txt"; se no scrivo un'applicazione java che me lo faccia xD |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Anche start è un comando built in del cmd. Per passare un comando al cmd, devi specificare l'opzione /C, così:
cmd /C del pippo |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Ah,io di recente ho avuto un problema con l'api di Windows per cambiare lo sfondo del desktop. A questa funzione passavo una wstring.c_str() ma non andava, poi ho aggiunto il null ed ha funzionato, quindi pensavo fosse quello il problema... non conosco nient'altro delle api di Windows.
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Lascia stare quel tipo (strano) di approccio e usa la funzione
remove http://www.cplusplus.com/reference/cstdio/remove/ |
![]() |
![]() |
![]() |
#16 |
Junior Member
Iscritto dal: Jun 2007
Messaggi: 19
|
oddio, non conoscevo quella funzione xD
Grazie mille, stavo cercando di mangiare uno yogurt con lo scolapasta, se mi consentite la metafora xD |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Mi chiedo come si possa pensare di programmare in C senza conoscerne le basi ...
... Ma tu pensavi che tutti i programmi C che vogliono cancellare un programma lo facciano con il Del del DOS ? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:13.