Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[résolu] [DELPHI] CreateProcess sur un fichier de commandes


Messages recommandés

Posté(e)

Bonsoir à tous :P

 

Voici l'unique ligne d'un fichier de commandes appelant l'utilitaire SQLITE3.EXE (compacteur de fichiers .SQLITE) :

 

@FOR %%G IN (*.sqlite) DO ( sqlite3 %%G "VACUUM" )

 

et ainsi, tous les fichier .SQLITE du répertoire sont compactés. Ce fichier de commande n'est pas de moi (je précise).

 

Lorsque j'appelle ce fichier ds une fenêtre DOS, pas de problème. Mais lorsque je tente de l'appeler depuis un programme Delphi, par un CreateProcess, rien à faire. C'est comme si SQLITE3.EXE ne recevait pas les paramètres passés par le fichier de commandes .CMD ...

 

J'ai tenté de faire un CreateProcess directement sur le fichier EXE, avec les mêmes paramètres... et re-vlan !

 

Ca ne marche pas.

 

POurquoi ?

 

Merci :P

Posté(e)

Eh tu fais un createprocess sur quoi au juste ?

Sur cmd.exe ou sur ton fichier de commande ?

 

Si c'est sur le fichier de commande, c'est normal que ca ne marche pas, il faut faire un createprocess sur cmd.exe et passer le nom du fichier de commande en parametre...

 

Si ce n'est pas ca, fais nous une copie du code ou tu appel CreateProcess...

 

++

Posté(e)
Eh tu fais un createprocess sur quoi au juste ?

Sur cmd.exe ou sur ton fichier de commande ?

 

Si c'est sur le fichier de commande, c'est normal que ca ne marche pas, il faut faire un createprocess sur cmd.exe et passer le nom du fichier de commande en parametre...

 

Si ce n'est pas ca, fais nous une copie du code ou tu appel CreateProcess...

 

++

Merci :P Voici le code :

[b]procedure Appel_Compacteur;
[/b]Var Rep_Courant : string;
Processus : string;
Parametre : string;
StartupInfo: TStartupinfo;
ProcessInfo: TProcessInformation;
Retour : longbool;
Rep : string;

[b]begin[/b]

 Rep_Courant := GetCurrentDir;

 FillChar(Startupinfo,Sizeof(TStartupinfo),0);
 Startupinfo.cb:=Sizeof(TStartupInfo);

 Processus :=	 Rep_Temp_Compactage + '\SQLITE3.EXE';
 ChDir(Rep);
 Parametre := Processus + ' ' + '@FOR %%G IN (*.sqlite) DO ( sqlite3 %%G "VACUUM" )';

 Retour := CreateProcess(nil,
					 PChar(Parametre),
		 nil,
					 nil,
					 false,
					 normal_priority_class,
					 nil,
					 PChar(Rep),
					 Startupinfo,ProcessInfo);

 if Retour <> false then
	begin
			WaitforSingleObject(Processinfo.hProcess, infinite);
			CloseHandle(ProcessInfo.hProcess);
	end
 else
	begin
			RaiseLastOSError;
	end;

 ChDir(Rep_Courant);

[b]end;[/b]

Posté(e)

Si "sqlite3" n'est pas dans le PATH et/ou qu'il n'est pas appelé avec son chemin complet, pas étonnant que ton CreateProcess refuse de faire quoi que ce soit.

Qui plus est, j'ai comme l'impression que tu tentes de faire exécuter ce "FOR" à sqlite3 et non à cmd....

Posté(e)

Salut a tous,

 

Hum, comme je disais plus haut, tu dois faire un CreateProcess sur cmd.exe avec comme parametre le chemin de ton fichier de commande (.cmd ou .bat)

 

Ou alors, tu appel direct SQLITE3.exe et tu recode la boucle for de ton fichier de commande en DELPHI ce qui me semble etre le plus raisonnable.

 

++

Posté(e)
Si "sqlite3" n'est pas dans le PATH et/ou qu'il n'est pas appelé avec son chemin complet, pas étonnant que ton CreateProcess refuse de faire quoi que ce soit.

Qui plus est, j'ai comme l'impression que tu tentes de faire exécuter ce "FOR" à sqlite3 et non à cmd....

 

Résolu :P !

 

La correction est ici :

 

Processus := Rep_Temp_Compactage + '\Compact.cmd';

Rep := Rep_Temp_Compactage;

ChDir(Rep);

Parametre := Processus;

 

Les reste de la procédure est inchangé.

La variable Processus donne ceci : 'C:\TEMP\COMPACTAGE SQLITE\compact.cmd ' Le fichier de commandes est exécuté, et c'est lui qui, effectivement, appelle SQLITE3.EXE .

  • Modérateurs
Posté(e)

Le problème semble avoir trouvé sa solution.

Ainsi, afin de signaler clairement à ceux qui ont un problème similaire qu'ils ont peut-être une solution toute trouvée (s'ils pensent à utiliser la fonction Recherche en indiquant le mot-clé "résolu" auparavant), et afin de signaler aux autres contributeurs qu'il est inutile de continuer à se creuser la tête sur le problème (à moins d'avoir des suppléments d'informations à apporter pour mieux comprendre ce qui posait problème), un modérateur a préfixé le titre du topic avec la mention [résolu].

Merci, à l'avenir, de bien vouloir prendre à votre charge cette mise à jour quand vous estimez que votre problème a été résolu de manière satisfaisante (et parallèlement, si le problème a disparu "mystérieusement", inutile d'induire les gens en erreur :P) Pour cela, p_edit.gif votre premier message :P

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...