WinExec() bug!!!

cs_ad59 Messages postés 4 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 4 juin 2003 - 30 mai 2003 à 12:31
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 4 juin 2003 à 13:48
Bonjour à tous Visualiens C++
Voila mon probléme :
je dois via mon application éxécuté plusieurs un utilitaire dos qui permet de modifier des fichiers image au format .tif et donc j'utilise la fonction WinExec() mais ceci je le fais dans une boucle car j'ai des centaines de fichiers à traité hors au bout d'un certain temps (95éme fichier) le programme plante et m'indique un probléme mémoire:"l'adresse xxxxx n'est pas writable" je ne comprends pas et là je suis à bout.....
j'ai dejà utilisé la fonction system() =>meme probléme...
que dois-je faire? Merci à vous.
A voir également:

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 mai 2003 à 12:40
WinExec() est a bannir, c'est un reste du temps de Win 3.
Il faut utiliser CreateProcess().
Ensuite faut etre certain de l'endroit ou se situe le plantage, avant lancement du prog externe, est-ce lui etc...
Tu devrais te faire un fichier log ou tu ecris les passages a certains endroits cles, tu pourras ainsi cerner le probleme.
BruNews, ciao...
0
cs_ad59 Messages postés 4 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 4 juin 2003
4 juin 2003 à 13:16
Resalut Vieux Lion..
j'ai enfin un résultat mais ça plante toujours voila mon code:
arrivé au 228éme fichiers traité il me dit:
L'instruction 0x004076a7 emploie l'adresse 0x02937b0 qui ne peut etre written....je suis desespéré tout mes espoirs étaient dans CreateProcess()................
voila mon code:

void Tiffkit(char *Source_Tif, char *Dest_Tif, int X, int Y, int gras, char *chaine)
{
char *Commande;
STARTUPINFO si;
PROCESS_INFORMATION pi;

Commande = (char *) malloc(TAILLE_COMMANDE);
sprintf(Commande, "%s source=%s, dest=%s, format=512, size=16, x=%d, y=%d, bold=%d,save=0, text=%s",
CHEMIN_TIFFKIT, Source_Tif, Dest_Tif, X, Y, gras, chaine);
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, Commande, NULL, NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("Error impossible de creer le process");
exit(1);
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}

Merci de m'éclairer une derniére fois et aprés je t'embête plus merci.
0
cs_ad59 Messages postés 4 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 4 juin 2003
4 juin 2003 à 13:35
Slt!
voila j'ai modifié mon code mais au bout du 228 fichier traités ça plante à cause de la mémoire...
peux tu m'éclairer voila mon code merci d'avance...:

void Tiffkit(char *Source_Tif, char *Dest_Tif, int X, int Y, int gras, char *chaine)
{
char *Commande;
STARTUPINFO si;
PROCESS_INFORMATION pi;

Commande = (char *) malloc(TAILLE_COMMANDE);
sprintf(Commande, "%s source=%s, dest=%s, format=512, size=16, x=%d, y=%d, bold=%d,save=0, text=%s",
CHEMIN_TIFFKIT, Source_Tif, Dest_Tif, X, Y, gras, chaine);
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, Commande, NULL, NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("Error impossible de creer le process");
exit(1);
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}

Cette fonction je l'appelle autant de fois qu'il y a de fichiers c'est à dire des centaines de fois....
je suis desesperé!!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 juin 2003 à 13:48
Commande = (char *) malloc(TAILLE_COMMANDE);
free(Commande); le pendant de malloc() je ne le vois pas, faut deja que tout le code soit nickel: memoire allouee implique memoire liberee.
De plus il faut tester le retour de malloc() != NULL et tu peux aussi remplacer malloc par HeapAlloc() vu que est code specifique win32 autant aller au + direct.
HANDLE hheap;
Enregistre 1 seule fois au debut du prog:
hheap = GetProcessHeap(); et servira pour les appels successifs de :
Commande = (char *) HeapAlloc(hheap, 0, size);
if(Commande == NULL) pas de memoire dispo;
ton bolot ici, et en sortie de func:
HeapFree(hheap, 0, Commande);
BruNews, ciao...
0
Rejoignez-nous