|
| 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)
resAPI est un booléen = API("KERNEL32","CreateProcessA", Null, &CommandLine, Null, Null, False, 0, Null, Null, &stStartupInfo, &stProcessInformation) IF resAPI THEN PID = stProcessInformation:ProcessId LOOP Dimension(PidProcess, 4096) IF NOT API("Psapi.dll", "EnumProcesses", &PidProcess, Dimension(PidProcess), &cbNeeded) THEN SORTIR TableauSupprimeDoublon(PidProcess) TableauTrie(PidProcess, ttCroissant) IF TableauCherche(PidProcess, tcDichotomique, PID) = -1 THEN SORTIR 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 = [ 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) 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 |
| |
| |
| | | |
|
| | | | |
| | |
|