Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

CMD History

9 réponses
Avatar
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.

9 réponses

Avatar
Christian ASTOR
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)
Avatar
Gilles
"Christian ASTOR" a écrit dans le message de
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.
Avatar
Christian ASTOR
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");

...
Avatar
Gilles
"Christian ASTOR" a écrit dans le message de
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.
Avatar
Christian ASTOR
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);
Avatar
Gilles
"Christian ASTOR" a écrit dans le message de
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 !!
Avatar
Gilles
"Christian ASTOR" a écrit dans le message de
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.
Avatar
Christian ASTOR
Gilles wrote:

"Christian ASTOR" a écrit dans le message de
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.
Avatar
Gilles
"Christian ASTOR" a écrit dans le message de
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