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

API Windows: ouverture fichier par glisser-déposer

10 réponses
Avatar
Hervé TOURBEZ
Bonsoir,

J'ai téléchargé le source "Ouverture fichiers" utilisant l'API Windows
sur le site developpez.com et l'ai compilé ave CodeWarrior C/C++ (je
viens du Mac où j'ai utilisé cet outil pendant des années et comme
j'avais aussi la version PC...).

Bref ça marche sans problème; on ouvre bien le fichier sélectionné
dans le dialogue d'ouverture standard.

N'étant pas très au fait du détail de la boucle d'évènements de
Windows, voilà ce que je voudrais faire: pouvoir ouvrir le fichier
simplement par double-clic (actuellement, le double-clic me lance bien
l'exécutable compilé ci-dessus, mais ça s'arrête là et il faut
utiliser alors l'option "Ouvrir" du menu "Fichier")

Que faut-il ajouter pour que le nom du fichier sur lequel on a
double-cliqué soit passé à l'exécutable de manière à rejoindre le code
là où on ouvre en lecture le dit fichier?

De même, le drag & drop du fichier sur l'icone de l'exécutable n'ouvre
pas non plus le fichier: là aussi je pense qu'il doit falloir ajouter
un évènement supplémentaire (lequel dans la terminologie Windows?)


En fait, je cherche à réaliser une "carcasse" passe-partout qui me
permette, d'ouvrir un fichier pour effectuer un traitement:
- soit par le menu "Ouvrir"
- soit par double clic (en supposant que l'assocation a été faite
préalablement avec l'exécutable pour ce type de fichier)
- soit par drag & drop du fichier sur l'exécutable (solution que
j'utilisais couramment sur Mac)

Où pourrais-je trouver ces infos, voir un exemple base de départ pour
mon développement?

10 réponses

Avatar
Paul Bacelar
"Hervé TOURBEZ" wrote in message
news:
Bonsoir,

J'ai téléchargé le source "Ouverture fichiers" utilisant l'API Windows
sur le site developpez.com et l'ai compilé ave CodeWarrior C/C++ (je
viens du Mac où j'ai utilisé cet outil pendant des années et comme
j'avais aussi la version PC...).

Bref ça marche sans problème; on ouvre bien le fichier sélectionné
dans le dialogue d'ouverture standard.

N'étant pas très au fait du détail de la boucle d'évènements de
Windows, voilà ce que je voudrais faire: pouvoir ouvrir le fichier
simplement par double-clic (actuellement, le double-clic me lance bien
l'exécutable compilé ci-dessus, mais ça s'arrête là et il faut
utiliser alors l'option "Ouvrir" du menu "Fichier")

Que faut-il ajouter pour que le nom du fichier sur lequel on a
double-cliqué soit passé à l'exécutable de manière à rejoindre le code
là où on ouvre en lecture le dit fichier?




Si je comprends bien, vous voulez associer un type de fichier à votre
executabe.

Par association, c'est l'action de lancer le programme quand on ouvre
(double-click dans l'explorateur de Windows) un fichier d'un type
particulier.

Cette association est stockée dans la Registry de Windows (une espèce de
base de données des données de configuration du système d'exploitation).

Pour avoir une vue plus claire de ce qu'est la Registry, lancez le programme
regedit.

http://www.codeguru.com/vb/gen/vb_system/directoriesandfiles/article.php/c4837/

De même, le drag & drop du fichier sur l'icone de l'exécutable n'ouvre
pas non plus le fichier: là aussi je pense qu'il doit falloir ajouter
un évènement supplémentaire (lequel dans la terminologie Windows?)




C'est encore la Registry qui est en cause (la clé Verb en particulier)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fa_verbs.asp


En fait, je cherche à réaliser une "carcasse" passe-partout qui me
permette, d'ouvrir un fichier pour effectuer un traitement:
- soit par le menu "Ouvrir"
- soit par double clic (en supposant que l'assocation a été faite
préalablement avec l'exécutable pour ce type de fichier)
- soit par drag & drop du fichier sur l'exécutable (solution que
j'utilisais couramment sur Mac)

Où pourrais-je trouver ces infos, voir un exemple base de départ pour
mon développement?



Les nombreux environnements de développement (VC++, VS .NET etc) ont des
assistants, et les environnements d'exécution (MFC, .NET, ATL, COM) des
fonctionnalités, qui facilitent grandement voir automatisent l'association
des fichiers à un programme.



Selon le but recherche pour l'application finale, les outils les plus
adaptés seront différents et la prise en charge de l'association plus ou
moins automatique.


--
Paul Bacelar
Avatar
Hervé TOURBEZ
Le Fri, 10 Mar 2006 03:38:45 +0100, "Paul Bacelar"
a écrit :


Si je comprends bien, vous voulez associer un type de fichier à votre
executabe.



non seulement (car bien sûr, j'ai associé le type de fichier à
l'exécutable en cochant l'option "toujours ouvrir avec" dans le
dialogue de Windows), mais surtout, et là c'est au niveau du code de
l'appli elle-même, il faut que le fichier s'ouvre (exactement comme si
on avait lancé l'exécutable, puis "Ouvrir..." et sélectionner le dit
fichier.

En réalité, le double-clic sur le fichier ne fait que lancer
l'exécutable et ça s'arrête là! Dommage... ça n'ouvre pas le fichier
car il doit manquer une gestion d'évènement dans la boucle.

De même, le drag & drop du fichier sur l'icone de l'exécutable n'ouvre
pas non plus le fichier: là aussi je pense qu'il doit falloir ajouter
un évènement supplémentaire (lequel dans la terminologie Windows?)





Là encore, j'aimerais bien savoir quelle est la partie de code à
ajouter à la boucle...

Un exemple serait le bien venu...
Avatar
Christian ASTOR
Hervé TOURBEZ a écrit :

Là encore, j'aimerais bien savoir quelle est la partie de code à
ajouter à la boucle...



Registry : %1
Appli : argv[1]
Avatar
Vincent Alex
Dans ton appli, il faut récupérer le nom du fichier dans la ligne de
commande qui à lancé ton appli. Petit exemple :

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int i;
LPSTR lpCmdLine;

hlpCmdLine = lpCmdLine;

if( lpCmdLine[0]== '' )
{
// pas de nom de fichier en paramètre
}
else
// Pour supprimer un eventuel "" entourant le nom du fichier rajouté par
windows
if (lpCmdLine[0] == '"' )
{
for (i=0; hlpCmdLine[i] != ''; i++);
lpCmdLine[i-1]='';
lpCmdLine++;
}
// Le nom du fichier alors est dans lpCmdLine
}

"Hervé TOURBEZ" a écrit dans le message de news:

Le Fri, 10 Mar 2006 03:38:45 +0100, "Paul Bacelar"
a écrit :


Si je comprends bien, vous voulez associer un type de fichier à votre
executabe.



non seulement (car bien sûr, j'ai associé le type de fichier à
l'exécutable en cochant l'option "toujours ouvrir avec" dans le
dialogue de Windows), mais surtout, et là c'est au niveau du code de
l'appli elle-même, il faut que le fichier s'ouvre (exactement comme si
on avait lancé l'exécutable, puis "Ouvrir..." et sélectionner le dit
fichier.

En réalité, le double-clic sur le fichier ne fait que lancer
l'exécutable et ça s'arrête là! Dommage... ça n'ouvre pas le fichier
car il doit manquer une gestion d'évènement dans la boucle.

De même, le drag & drop du fichier sur l'icone de l'exécutable n'ouvre
pas non plus le fichier: là aussi je pense qu'il doit falloir ajouter
un évènement supplémentaire (lequel dans la terminologie Windows?)





Là encore, j'aimerais bien savoir quelle est la partie de code à
ajouter à la boucle...

Un exemple serait le bien venu...


Avatar
Christian ASTOR
Vincent Alex a écrit :

Dans ton appli, il faut récupérer le nom du fichier dans la ligne de
commande qui à lancé ton appli. Petit exemple :



__argv[1] est qd même plus simple...
Avatar
Hervé TOURBEZ
Le Fri, 10 Mar 2006 10:34:06 +0100, "Vincent Alex"
a écrit :

Dans ton appli, il faut récupérer le nom du fichier dans la ligne de
commande qui à lancé ton appli



Ah... mais le problème, Vincent, c'est que je n'utilise pas de ligne
de commande (puisque je veux utiliser l'API Windows).

Donc, pour résumer, je double-clique sur le fichier à ouvrir, ça lance
mon exécutable (puisqu'il y est associé par son type). Maintenant,
comment puis-je récupérer le chemin (ou un pointeur ad-hoc) nécessaire
pour pouvoir ouvrir le dit fichier sans intervention de l'utilisateur?
Avatar
Hervé TOURBEZ
Le 10 Mar 2006 02:07:35 -0800, "Christian ASTOR"
a écrit :

argv[1] est qd même plus simple...



Peut-être, mais alors on reste "spartiate" quant à la façon d'ouvrir
un fichier (pas besoin d'utiliser l'API windows, un code ANSI-C avec
son main() standard suffit!)

je voudrais utiliser la possiblité de l'API qui permet d'ouvrir un
fichier par double-clic (le nom du fichier est alors passé par Windows
lui-même à l'exécutable qui doit le gérer).

De même pour le glisser-déposer, seule la manière diffère...
Avatar
Christian ASTOR
Hervé TOURBEZ wrote:

argv[1] est qd même plus simple...





__argv[1] pour GUI

Peut-être, mais alors on reste "spartiate" quant à la façon d'ouvrir
un fichier (pas besoin d'utiliser l'API windows, un code ANSI-C avec
son main() standard suffit!)



Mais là, on ne l'ouvre pas encore, on récupère juste son path+nom...

je voudrais utiliser la possiblité de l'API qui permet d'ouvrir un
fichier par double-clic (le nom du fichier est alors passé par Windows
lui-même à l'exécutable qui doit le gérer).



Quand on double-clique, le Shell appelle CreateProcess() sur l'exe
associé après avoir lu la registry. Et si on ne gère pas les arguments
de la ligne de commandes, rien ne se passera.
(Pour lancer un exe associé à une ext., ShellExecute() qui appelle
ShellExecuteEx() qui appelle CreateProcess(), mais pas de rapport ici)
Avatar
Hervé TOURBEZ
Le Sat, 11 Mar 2006 01:00:17 +0100, Christian ASTOR
a écrit :

Quand on double-clique, le Shell appelle CreateProcess() sur l'exe
associé après avoir lu la registry. Et si on ne gère pas les arguments
de la ligne de commandes, rien ne se passera.



OK Christian.

Donc, pour résumer, si je double-clique sur le fichier, mon exécutable
est bien lancé (ce qui est le cas actuellement), mais si je veux que
le fichier soit ouvert (par la partie de code de l'exécutable chargée
de le gérer - entre autre avec l'option "Ouvrir..." du menu
"Fichier"), il me faut récupérer via les arguments de la ligne de
commandes les infos nécessaires que je passe alors à la fonction
d'ouverture ci-dessus....

Ca me parait bien tout ça. Mon problème (comme je ne suis pas habitué
à cette démarche), c'est que je ne vois pas bien comment gérer ces
fameux arguments, qui si j'ai bien compris, sont mis à jour par le
Shell via CreateProcess().

Aurais-tu stp un exemple à me donner?

PS: j'ai bien essayé de voir si lpCmdLine de WinMain avait ce que je
cherche après double clic sur le fichier à ouvrir mais sans succès.

Dans ton post précédent du me mets: Registry : %1
Appli : argv[1]

Peux-tu me préciser un peu ce que tu entends par Registry : %1
Avatar
Christian ASTOR
Hervé TOURBEZ wrote:


Ca me parait bien tout ça. Mon problème (comme je ne suis pas habitué
à cette démarche), c'est que je ne vois pas bien comment gérer ces
fameux arguments, qui si j'ai bien compris, sont mis à jour par le
Shell via CreateProcess().

Aurais-tu stp un exemple à me donner?

PS: j'ai bien essayé de voir si lpCmdLine de WinMain avait ce que je
cherche après double clic sur le fichier à ouvrir mais sans succès.

Dans ton post précédent du me mets: Registry : %1
Appli : argv[1]

Peux-tu me préciser un peu ce que tu entends par Registry : %1



"%1" est juste l'argument dans l'association pour le ProgID (ex :
txtfile) après le nom de l'exe ds ...shellopencommand
Et on récupère donc le nom du premier argument (le fichier) dans
lpCmdLine ou __argv[1] ou GetCommandLine()

(ensuite tu l'ouvres avec fopen() ou CreateFile() ou autre)