PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → J'essaie de réaliser un < LanceAppli > avec une API ...
J'essaie de réaliser un < LanceAppli > avec une API ...
Iniciado por Michel, 22,abr. 2020 18:08 - 8 respuestas
Miembro registrado
127 mensajes
Publicado el 22,abril 2020 - 18:08
Bonjour,

En m'inspirant du modèle de Philippe Pasquali ( https://is.gd/0guFNZ ; Posté le 26 septembre 2018), j'essaie de réaliser un < LanceAppli > avec une API :
bIsOk est un entier=API("KERNEL32","CreateProcessA", ...
&lpApplicationName, &lpCommandLine,Null,Null,Faux,0,Null,Null, &stProcessInformation, &stStartupInfoA)

Tout se passe bien, sauf que l'<exe> est un < WDConver.exe > et qu'il lui faut un certain temps pour exécuter la conversion ; sinon le fichier converti (résultant) est tronqué ... Ce qui se passe (latence) sans accroc si par exemple on place un point d'arrêt après le code ci-dessus : la conversion a le temps de s'exécuter avant de rendre la main ...

Ceci est parfaitement géré avec la constante < exeBloquant > dans le < LanceAppli >.

L'API 'équivalente' à l' < exeBloquant > est de la forme (attente du temps nécessaire à l'exécution complète de l' <exe>) :
RetourFonction=API("KERNEL32","WaitForSingleObject", &stProcessInformation.hProcess, 0xFFFF)

... sauf que là je cale : j'ai modifié le 'timeout' (0xFFFF), essayé avec ou sans < & > devant les membres (cf. ci-dessus) ... RIEN ! La conversion n'a pas lieu (EXACTEMENT comme en l'absence de l'< exeBloquant > dans le < LanceAppli >) ...

Comment écririez-vous cela ?

--
Merci encore,
Mike

• Soyez indulgents : je ne suis pas programmeur !
Miembro registrado
948 mensajes
Publicado el 23,abril 2020 - 01:36
Bonsoir
J'ai revu mon code et je me suis aperçu qu'il était en partie bugé. Voici la version corigée testée en Windev-V20 sur un PC Windows 10-64 bits.
STARTUPINFOA est une structure
cb est un entier sur 4 octets sans signe
lpReserved est un entier système
lpDesktop est un entier système
lpTitle est un entier système
dwX est un entier sur 4 octets sans signe
dwY est un entier sur 4 octets sans signe
dwXSize est un entier sur 4 octets sans signe
dwYSize est un entier sur 4 octets sans signe
dwXCountChars est un entier sur 4 octets sans signe
dwYCountChars est un entier sur 4 octets sans signe
dwFillAttribute est un entier sur 4 octets sans signe
dwFlags est un entier sur 4 octets sans signe
wShowWindow est un entier sur 2 octets sans signe
cbReserved2 est un entier sur 2 octets sans signe
lpReserved2 est un entier sur 8 octets sans signe
hStdInput est un entier système
hStdOutput est un entier système
hStdError est un entier système
END

PROCESS_INFORMATION est une structure
hProcess est un entier système
hThread est un entier système
ProcessId est un entier sur 4 octets sans signe
ThreadId est un entier sur 4 octets sans signe
END

stStartupInfo est une STARTUPINFOA
stProcessInformation est une PROCESS_INFORMATION
PID est un entier sur 4 octets sans signe = 0x00
PidProcess est un tableau dynamiquedynamique de 0 entier sans signe sur 4 octets
cbNeeded est un entier sans signe sur 4 octets

CommandLine est une chaîne ASCIIZ sur 1024 = [
D:\Mes Projets\testwait\Exe\testwait.exe
]
stStartupInfo:cb = Dimension(stStartupInfo)
// read : https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
resAPI est un booléen = API("KERNEL32","CreateProcessA", Null, &CommandLine, Null, Null, False, 0, Null, Null, &stStartupInfo, &stProcessInformation)
IF resAPI THEN
PID = stProcessInformation:ProcessId
// On attend la fin du programme lancé
LOOP
Dimension(PidProcess, 4096) // si besoin on peut augmenter le nombre
// on demande la liste des PID en cours sur la machine
// read : https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocesses
IF NOT API("Psapi.dll", "EnumProcesses", &PidProcess, Dimension(PidProcess), &cbNeeded) THEN SORTIR
// on vérifie si le PID du programme lancé existe toujours
TableauSupprimeDoublon(PidProcess)
TableauTrie(PidProcess, ttCroissant)
IF TableauCherche(PidProcess, tcDichotomique, PID) = -1 THEN SORTIR
// il existe encore on boucle
TableauSupprimeTout(PidProcess)
MultitâcheRepeint()
END
ELSE
Erreur("Oup'sss")
END

le code généré peut être en 32 bits ou 64 Bits

--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Miembro registrado
127 mensajes
Publicado el 23,abril 2020 - 11:44
Bonjour et merci de t’être replongé dans ton code ...
Ça marche impec ...

J'aurais pourtant bien résolu le problème du :
API("KERNEL32","WaitForSingleObject", ... )

... comme dans ceci :
SI AppelDLL32("kernel32","CreateProcessA",Null,&lpApplicationName,Null,Null,Vrai,NORMAL_PRIORITY_CLASS,Null,Null,&sinf,&proinf) ALORS
AppelDLL32("Kernel32","WaitForSingleObject",proinf:hProcess,Infinite)
AppelDLL32("kernel32","CloseHandle",proinf:hProcess)
AppelDLL32("kernel32","CloseHandle",proinf:hThread)
...

... provenant de cela : https://is.gd/fuSRmz

... Gourmand ! Je sais, mais un peu de fun n'a jamais fait de mal et dans le cas présent, j'aurais voulu comparer la vitesse de l'API à celle de la fonction WinDev (du < LanceApli > en l'occurence) parfois plus favorable (et plus concise ?) ...

--
Merci encore,
Mike

• Soyez indulgents : je ne suis pas programmeur !
Miembro registrado
127 mensajes
Publicado el 23,abril 2020 - 14:34
Suite :
A priori, ceci passe (conversion complète du fichier 'importé') :
//CommandLine est une chaîne ASCIIZ sur 1024 = [
//D:\Mes Projets\testwait\Exe\testwait.exe
//]

CommandLine est une chaîne ASCIIZ sur 1024 = [
C:\WINDEV 25_64\Programmes\WDConver.exe /SCRIPT=D:\WINDEV_S\import_HONO.wdv
]

resAPI est un booléen = ...
API("KERNEL32","CreateProcessA", Null, &CommandLine, Null, Null, False, 0, Null, Null, &stStartupInfo, &stProcessInformation)

IF resAPI THEN

P_HD est un entier sur 4 octets sans signe = stProcessInformation.hProcess
TH_HD est un entier sur 4 octets sans signe = stProcessInformation.hThread

API("KERNEL32","WaitForSingleObject", P_HD, -1) // -1 : valeur de la constante < INFINITE >
API("KERNEL32","CloseHandle", P_HD)
API("KERNEL32","CloseHandle", TH_HD)

ELSE
Erreur("Oup'sss")
END

... le gain en terme de vitesse ne semblant pas - à vu de nez - spectaculaire ...

Qu'en pensez-vous ?

--
Merci encore,
Mike

• Soyez indulgents : je ne suis pas programmeur !
Miembro registrado
1.002 mensajes
Publicado el 23,abril 2020 - 14:43
Bonjour,

Comment utiliser ton code pour lancer un exe en tant qu'admin avec un autre user/password ?

J'y arrive avec CreateProcessWithLogonW à lancer en tant qu'autre user mais sans les privilège admin

j'ai même essayé avec LogonUserA / GetTokenInformation / DuplicateTokenEx / CreateProcessAsUserA
Mans sans succès, je pense que ma syntaxe ou ma procédure n'est pas bonne

Si tu pouvais éclairer ma lanterne ce serait super,

Je t'en remercie d'avance

Jordan
Miembro registrado
127 mensajes
Publicado el 23,abril 2020 - 15:45
Bonjour,
Je pense que ta question s’adresse plutôt à Philippe Pasquali car cela dépasse carrément mes compétences (cf. infra) ...
Mais ce fil prouve que le Forum permet de répondre à de nombreuses questions ...
Bonne suite et bonne journée,
Miembro registrado
127 mensajes
Publicado el 23,abril 2020 - 15:58
cf. infra =

--
Mike

• Soyez indulgents : je ne suis pas programmeur !
Miembro registrado
1.002 mensajes
Publicado el 25,abril 2020 - 17:01
UP,
Je relance le sujet si une âme charitable passe par ici

Jordan
Miembro registrado
1.002 mensajes
Publicado el 28,abril 2020 - 19:02
UP+1