CMD History

Le
Gilles
Bonjour,

Dans une application CUI développée sous XP avec MSVC6, je cherche à
écrire deux fonctions. La première permettant de lire les commandes
disponibles dans l'historique (comme doskey / history) et la seconde
permettant de charger automatiquement des commandes dans l'historique à
partir d'un fichier. Le but étant de conserver l'historique des
commandes (accessible par la touche F7) entre plusieurs sessions. J'ai
jeté un oeil sur MSDN et à priori aucune API console documentée permet
de réaliser cela. En revanche doskey.exe semble utiliser des API non
documentées :
GetConsoleCommandHistory
GetConsoleCommandHistoryLength


Auriez-vous quelques pistes ?

Merci par avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #9750011
Gilles wrote:

Dans une application CUI développée sous XP avec MSVC6, je cherche à
écrire deux fonctions. La première permettant de lire les commandes
disponibles dans l'historique (comme doskey / history) et la seconde
permettant de charger automatiquement des commandes dans l'historique à
partir d'un fichier. Le but étant de conserver l'historique des
commandes (accessible par la touche F7) entre plusieurs sessions. J'ai
jeté un oeil sur MSDN et à priori aucune API console documentée permet
de réaliser cela. En revanche doskey.exe semble utiliser des API non
documentées :
GetConsoleCommandHistory
GetConsoleCommandHistoryLength
...

Auriez-vous quelques pistes ?



Ca marche pour moi, mais apparemment qu'avec la version Unicode pour la
longueur (GetConsoleCommandHistoryLengthW()),
GetConsoleCommandHistoryLengthW() et
GetConsoleCommandHistoryW() (ou A()) étant appelées dynamiquement de
kernel32.dll, et qu'à partir d'une fenêtre console (L"cmd.exe" en paramètre)
Gilles
Le #9750001
"Christian ASTOR" news:470105f9$0$21146$
| Gilles wrote:
|
|| Dans une application CUI développée sous XP avec MSVC6, je cherche à
|| écrire deux fonctions. La première permettant de lire les commandes
|| disponibles dans l'historique (comme doskey / history) et la seconde
|| permettant de charger automatiquement des commandes dans
|| l'historique à partir d'un fichier. Le but étant de conserver
|| l'historique des commandes (accessible par la touche F7) entre
|| plusieurs sessions. J'ai jeté un oeil sur MSDN et à priori aucune
|| API console documentée permet de réaliser cela. En revanche
|| doskey.exe semble utiliser des API non documentées :
|| GetConsoleCommandHistory
|| GetConsoleCommandHistoryLength
|| ...
||
|| Auriez-vous quelques pistes ?
|
| Ca marche pour moi, mais apparemment qu'avec la version Unicode pour
| la longueur (GetConsoleCommandHistoryLengthW()),
| GetConsoleCommandHistoryLengthW() et
| GetConsoleCommandHistoryW() (ou A()) étant appelées dynamiquement de
| kernel32.dll, et qu'à partir d'une fenêtre console (L"cmd.exe" en
| paramètre)

Merci Christian,

Pourriez-vous m'indiquer les prototypes de ces deux API ?

Merci par avance.
Christian ASTOR
Le #9749991
Gilles wrote:

Merci Christian,

Pourriez-vous m'indiquer les prototypes de ces deux API ?

Merci par avance.




Par ex =>

typedef DWORD (WINAPI*GCCHLW) (IN LPWSTR sExeName);
typedef DWORD (WINAPI*GCCHW) (OUT LPWSTR sCommands, IN DWORD
nBufferLength, IN LPWSTR sExeName);

HMODULE hDLL = LoadLibrary("kernel32.dll");

GCCHLW pGetConsoleCommandHistoryLengthW;
GCCHW pGetConsoleCommandHistoryW;

pGetConsoleCommandHistoryLengthW = (GCCHLW)GetProcAddress(hDLL,
"GetConsoleCommandHistoryLengthW");
pGetConsoleCommandHistoryW = (GCCHW)GetProcAddress(hDLL,
"GetConsoleCommandHistoryW");

...
Gilles
Le #9749981
"Christian ASTOR" news:47011622$0$21144$
| Gilles wrote:
||
|| Merci Christian,
||
|| Pourriez-vous m'indiquer les prototypes de ces deux API ?
||
|| Merci par avance.
|
|
| Par ex =>
|
| typedef DWORD (WINAPI*GCCHLW) (IN LPWSTR sExeName);
| typedef DWORD (WINAPI*GCCHW) (OUT LPWSTR sCommands, IN DWORD
| nBufferLength, IN LPWSTR sExeName);

Merci Christian !

Tout est en ordre pour la première partie (dump)
En revanche, comment "injecter" des commandes dans l'historique ?
Peut-être une nouvelle fois avec une API non documentée ;-)

De plus, connaitriez-vous les prototypes des fonctions suivantes :

SetConsoleCommandHistoryMode (Reg:HistoryNoDup ?)
SetConsoleNumberOfCommands (Reg:HistoryBufferSize ?)
ExpungeConsoleCommandHistory (ALT-F7 ?)

Merci par avance.
Christian ASTOR
Le #9749971
Gilles wrote:

Merci Christian !

Tout est en ordre pour la première partie (dump)
En revanche, comment "injecter" des commandes dans l'historique ?
Peut-être une nouvelle fois avec une API non documentée ;-)

De plus, connaitriez-vous les prototypes des fonctions suivantes :

SetConsoleCommandHistoryMode (Reg:HistoryNoDup ?)
SetConsoleNumberOfCommands (Reg:HistoryBufferSize ?)
ExpungeConsoleCommandHistory (ALT-F7 ?)



Pour injecter dans l'historique, je ne vois pas (doskey n'a pas l'air de
pouvoir le faire où ai-je loupé une option ?)

Pour les fonctions :

BOOL SetConsoleCommandHistoryMode(IN DWORD nFlags);
Mais elle a été apparemment supprimée sous Vista...

BOOL SetConsoleNumberOfCommandsW(IN DWORD nNumber, IN LPWSTR sExeName);
VOID ExpungeConsoleCommandHistoryW(IN LPWSTR sExeName);
Gilles
Le #9749961
"Christian ASTOR" news:470141d8$0$21144$
| Pour injecter dans l'historique, je ne vois pas (doskey n'a pas l'air
| de pouvoir le faire où ai-je loupé une option ?)

Non, justement aucune option doskey pour cela !
Mais il y a bien un composant qui sache le faire :
(cmd.exe ?, csrss ?, ntvdm.exe ?, ...)

| Pour les fonctions :
|
| BOOL SetConsoleCommandHistoryMode(IN DWORD nFlags);
| Mais elle a été apparemment supprimée sous Vista...
|
| BOOL SetConsoleNumberOfCommandsW(IN DWORD nNumber, IN LPWSTR
| sExeName); VOID ExpungeConsoleCommandHistoryW(IN LPWSTR sExeName);

Merci beaucoup !

Une nouvelle fois, Bravo !!
Gilles
Le #9749951
"Christian ASTOR" news:470141d8$0$21144$

Bonjour,

| VOID ExpungeConsoleCommandHistoryW(IN LPWSTR sExeName);

J'ai un problème avec cette API ! Elle ne fonctionne qu'une seule fois.
A la première invocation l'historique est bien supprimé en revanche
doskey semble perturbé. En effet, si ensuite j'ajoute des nouvelles
commandes dans l'historique (par saisies dans la console cmd par
exemple) alors d'une part cette API ne fonctionne plus et d'autre part
doskey /history ne dump plus rien. Toutefois les touches F7 / Alt-F7
continuent de fonctionner correctement. Le vidage de l'historique par
Alt-F7 permet de rétablir le fonctionnement. Rencontrez-vous le même
problème ?

Merci par avance.
Christian ASTOR
Le #9749941
Gilles wrote:

"Christian ASTOR" news:470141d8$0$21144$

Bonjour,

| VOID ExpungeConsoleCommandHistoryW(IN LPWSTR sExeName);

J'ai un problème avec cette API ! Elle ne fonctionne qu'une seule fois.
A la première invocation l'historique est bien supprimé en revanche
doskey semble perturbé.



Oui, mais c'est ce que fait doskey/reinstall : ça ne marche qu'une fois
avec les mêmes symptômes.
Gilles
Le #9749931
"Christian ASTOR" news:470280b0$0$21146$

| Oui, mais c'est ce que fait doskey/reinstall : ça ne marche qu'une
| fois avec les mêmes symptômes.

Tout à fait exact Christian !
Je viens de tester et le comportement est identique :-(
En revanche Alt-F7 fait le job ! Bizarre !

Encore merci :-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Publicité
Poster une réponse
Anonyme