grandyaka54
Messages postés97Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention18 décembre 2013
-
4 janv. 2012 à 08:52
grandyaka54
Messages postés97Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention18 décembre 2013
-
6 janv. 2012 à 11:35
Bonjour à tous,
J'utilise dans mon programme la fonction CreateProcess() pour lancer une autre application.
Quand je lance cette application manuellement, je vois dans l'onglet Processus du Gestionnaire des tâches, le nom complet de mon application qui s'appelle EBICSMoteur.exe or quand je le lance depuis le CreateProcess(), le nom de mon application est tronqué en EBISCM~1.exe ou EBISCM~2.exe
Je souhaiterai, quand je lance mon application par la fonction CreateProcess(), le nom reste en entier.
Voici mon code :
function TFonctions.LanceComEBICS(DossierAppli: String): Byte;
var
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
CreateOK : Boolean;
Commande : String;
NomUtil : String;
cExe : array [0..255] of Char;
sExe : String;
fnFile : TFileName;
ProcEbics : Dword;
Begin
NomUtil := '"Standard"';
fnFile := ExtractFilePath(Application.ExeName) + 'EBICSMoteur.exe';
FindExecutable(PChar(ExtractFileName(fnFile)), PChar(ExtractFilePath(fnFile)), cExe);
sExe := String(cExe);
FillChar(StartInfo,SizeOf(TStartupInfo), #0); // Mise à zéro de la structure StartInfo
//Seule la taille est renseignée, toutes les autres options laissées à zéro prendront les valeurs par défaut
ZeroMemory(@StartInfo, SizeOf(StartInfo));
StartInfo.cb := SizeOf(StartInfo);
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := SW_NORMAL;
FillChar(ProcInfo,SizeOf(TProcessInformation), #0);
Commande := '"' + fnfile + '" "' + DossierAppli + '" '+ NomUtil;
CreateOK := CreateProcess(PChar(sExe),
PChar(Commande),
nil,
nil,
False,
CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS + CREATE_DEFAULT_ERROR_MODE,
nil,
PChar(ExtractFilePath(fnFile)),
StartInfo,
ProcInfo);
if CreateOK then //CreateOK est à True si le process est bien créé.
begin
ProcEbics := ProcInfo.dwProcessId;
//Tant que mon EBICS tourne , on traite les messages pour ne pas figer l'application
repeat
Application.ProcessMessages;
EnumWindows(@EbicsAuPremierPlan, ProcEbics);
until WaitForSingleObject(ProcInfo.hProcess, 100) = WAIT_OBJECT_0 ;
try
CloseHandle(ProcInfo.hThread); //On Close le Thread
CloseHandle(ProcInfo.hProcess); //On Close le Process
except;
end;
Result := 0; //Ici, la télétrans a bien fonctionné. On met donc RESULT à 0.
end
else begin
//Si on a pas pu lancer le process de la télétrans.
Result := 13;
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
grandyaka54
Messages postés97Date d'inscriptionvendredi 19 octobre 2007StatutMembreDernière intervention18 décembre 20135 4 janv. 2012 à 11:22
Bonjour WhiteHippo,
Merci de m'apporter ton aide. Je me suis empressé de mettre en place ton idée.
Mais hélas, le CreateProcess plante et me donne comme message d'erreur : Syntaxe du nom de fichier, de répertoire ou de volume incorrecte.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 4 janv. 2012 à 12:55
J'ai fait un test avec l'executable XNResourceditor.exe sous XP avec le code suivant compilé sous Delphi XE2 :
function LancerExe(const ExeAvecChemin : String): Byte;
var
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
CreateOK : Boolean;
Commande : String;
NomUtil : String;
cExe : array [0..255] of Char;
sExe : String;
fnFile : TFileName;
ProcEbics : Dword;
Begin
FillChar(StartInfo,SizeOf(TStartupInfo), #0); // Mise à zéro de la structure StartInfo
//Seule la taille est renseignée, toutes les autres options laissées à zéro prendront les valeurs par défaut
ZeroMemory(@StartInfo, SizeOf(StartInfo));
StartInfo.cb := SizeOf(StartInfo);
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := SW_NORMAL;
FillChar(ProcInfo,SizeOf(TProcessInformation), #0);
Commande := PChar(ExeAvecChemin) +' "' + PChar(ExeAvecChemin) + '"';
CreateOK := CreateProcess(NIL,
PChar(Commande),
nil,
nil,
False,
CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS + CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
StartInfo,
ProcInfo);
if CreateOK then //CreateOK est à True si le process est bien créé.
begin
ProcEbics := ProcInfo.dwProcessId;
//Tant que mon EBICS tourne , on traite les messages pour ne pas figer l'application
repeat
Application.ProcessMessages;
// EnumWindows(@EbicsAuPremierPlan, ProcEbics);
until WaitForSingleObject(ProcInfo.hProcess, 100) = WAIT_OBJECT_0 ;
try
CloseHandle(ProcInfo.hThread); //On Close le Thread
CloseHandle(ProcInfo.hProcess); //On Close le Process
except;
end;
Result := 0; //Ici, la télétrans a bien fonctionné. On met donc RESULT à 0.
end
else begin
//Si on a pas pu lancer le process de la télétrans.
Result := 13;
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
// Code d'appel
LancerExe( 'D:\utilitaires\XN Resource Editor\XNResourceEditor.exe' ) ;
A priori, pas de souci de nom long.
N.B. Attention les chaines sous Delphi XE2 sont de l'UNICODE et non de l'ANSI.
Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 4 janv. 2012 à 14:50
Donc, le problème vient de chez toi.
Quelques questions :
[list] Tu as essayé avec "XNRexourceEditor.exe" (disponible ici) ?
Ton système d'exploitation ?
Ton exécutable est une application 16 bits, une application maison ?/listCordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 5 janv. 2012 à 19:19
ah ... je m'en doutais ...
[quote=grandyaka54]Mais si dans le CreateProcess, je mets ''Nil'' a la place de ''sExe'', le résultat reste le même.
/quote
et c'est normal ... si tu lui donnes un nom court en entrée tu auras un nom court dans le Gestionnaire des tâches.
Fais le teste avec le nom long.
voir "GetLongPathName"