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

Répertoire courant lors d'une association de fichiers

11 réponses
Avatar
Stan
Bonjour,

je développe une appli en visual C++ ( visual studio .net ) qui exploite des
fichiers en .jpg.
J'ai fait une association de fichiers pour ouvrir cette appli
automatiquement lorsque je double-clique un fichier jpg.
Mon problème est que pour fonctionner, mon appli fait appel à d'autres
fichiers qui se trouvent sur le meme répertoire que l'appli. Lorsque je
double clique un jpg, l'appli ne trouve pas les autres fichiers nécessaires
à son fonctionnement puisque le répertoire courant est celui du jpg. Comment
retrouver en C++ le répertoire sur lequel est stocké mon appli ? Merci pour
votre aide.

Stan

10 réponses

1 2
Avatar
Patrick D.
On Mon, 6 Sep 2004 20:38:50 +0200, Stan wrote:

Bonjour,

je développe une appli en visual C++ ( visual studio .net ) qui exploite
des
fichiers en .jpg.
J'ai fait une association de fichiers pour ouvrir cette appli
automatiquement lorsque je double-clique un fichier jpg.
Mon problème est que pour fonctionner, mon appli fait appel à d'autres
fichiers qui se trouvent sur le meme répertoire que l'appli. Lorsque je
double clique un jpg, l'appli ne trouve pas les autres fichiers
nécessaires
à son fonctionnement puisque le répertoire courant est celui du jpg.
Comment
retrouver en C++ le répertoire sur lequel est stocké mon appli ? Merci
pour
votre aide.





pour l'inspiration :
une application reçoit, en général, automatiquement comme paramètre, son
chemin d'accès complet
par ex dans un code en Delphi, j'ai

CHEMINDEFAUT = ParamStr( 0) ;
dans CHEMINDEFAUT je recupère, par ex 'C:Program FilesMon
répertoireMonProgramme.Exe'

après tu peux faire du découpage de chaînes sur l'antislash

tu n'auras aucun mal à adapter en C++

--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Arnaud Debaene
Stan wrote:
Bonjour,


<snip>
Comment retrouver en C++ le répertoire sur lequel est
stocké mon appli ? Merci pour votre aide.


GetModuleFileName(NULL, ...)

Arnaud
MVP - VC
Avatar
Arnaud Debaene
Patrick D. wrote:
On Mon, 6 Sep 2004 20:38:50 +0200, Stan wrote:



pour l'inspiration :
une application reçoit, en général, automatiquement comme paramètre,
son chemin d'accès complet


<snip>
Et dans les "cas particuliers" où ce n'est pas le cas ?

Arnaud
Avatar
Stan
> GetModuleFileName(NULL, ...)

Arnaud
MVP - VC


Parfait, merci !
Avatar
Patrick D.
On Mon, 6 Sep 2004 21:10:21 +0200, Arnaud Debaene
wrote:

Patrick D. wrote:
On Mon, 6 Sep 2004 20:38:50 +0200, Stan wrote:



pour l'inspiration :
une application reçoit, en général, automatiquement comme paramètre,
son chemin d'accès complet


<snip>
Et dans les "cas particuliers" où ce n'est pas le cas ?

Arnaud





le cas général l'est à 99.99%
il me semble qu'il avait 1 ou 2 langages ou L4G qui ne passaient pas ce
paramètre 0.
Le C passe ce param 0, comme tu l'a mis dans un autre post.


--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Arnaud Debaene
Patrick D. wrote:
On Mon, 6 Sep 2004 21:10:21 +0200, Arnaud Debaene
wrote:

Patrick D. wrote:
On Mon, 6 Sep 2004 20:38:50 +0200, Stan wrote:



pour l'inspiration :
une application reçoit, en général, automatiquement comme paramètre,
son chemin d'accès complet


<snip>
Et dans les "cas particuliers" où ce n'est pas le cas ?



le cas général l'est à 99.99%
il me semble qu'il avait 1 ou 2 langages ou L4G qui ne passaient pas
ce paramètre 0.


Le problème surtout, c'est que rien ne garantit que ce paramètre soit le nom
complèt (ave chemin) de l'exécutable. Ce qui est passé, c'est la chaîne
exacte passée en paramètre à CreateProcess, donc c'est entièrement dépendant
du processus père qui créé le nouveau processus. Raison pour laquelle on ne
peut s'appuyer dessus (et raison pour laquelle c'est un b**** innommable de
gérer cela sous Unix, où il n'y a pas d'équivalent à GetModuleFileName.)

Le C passe ce param 0, comme tu l'a mis dans un autre post.


J'ai dis çà moi?

Arnaud
Avatar
Patrick D.
On Tue, 7 Sep 2004 11:36:35 +0200, Arnaud Debaene
wrote:

Le C passe ce param 0, comme tu l'a mis dans un autre post.


J'ai dis çà moi?




si on décortiquait le 'getmodule ....'


--
* enlevez '.don't.spam' et '.invalid' de mon adresse eMail si vous voulez
m'écrire *
* Donne un poisson à un homme, il aura à manger pour un jour
* Apprends-lui à pêcher, il aura à manger pour tous les jours de sa vie *
Avatar
Arnaud Debaene
Patrick D. wrote:
On Tue, 7 Sep 2004 11:36:35 +0200, Arnaud Debaene
wrote:

Le C passe ce param 0, comme tu l'a mis dans un autre post. J'ai
dis çà moi?






si on décortiquait le 'getmodule ....'



On trouverait quoi si on décorticait GetModuleFileName? Ca n'a rien à voir
avec les paramètres passés au main!

Arnaud
Avatar
Bertrand Lenoir-Welter
> Le problème surtout, c'est que rien ne garantit que ce paramètre soit le nom
complèt (ave chemin) de l'exécutable. Ce qui est passé, c'est la chaîne
exacte passée en paramètre à CreateProcess, donc c'est entièrement dépendant
du processus père qui créé le nouveau processus.



Là, vous m'étonnez. A mon sens, au point d'entrée d'un programme EXE,
l'argument 0 est toujours le nom de l'exécutable avec son chemin d'accès
complet, quel que soit le processus lanceur. En tout cas, c'est comme ça
que j'ai toujours fait et j'ai jamais eu un problème signalé.


#include <dir.h>

int main(int ArgNb, char *ArgStr[]) {
fnsplit(ArgStr[0],DriveStr,DirStr,NameStr,ExtStr); // fait le reste
}


Bon, je ne sors jamais de Windows, désolé. Mais il me semble que le post
original parlait de Visual C++, ce qui laisse présumer que c'est aussi
le cas.
Avatar
castorix
"Patrick D." <patrickr.dubois.don' wrote in message news:...
On Tue, 7 Sep 2004 11:36:35 +0200, Arnaud Debaene
wrote:

>> Le C passe ce param 0, comme tu l'a mis dans un autre post.
> J'ai dis çà moi?
>

si on décortiquait le 'getmodule ....'



GetModuleFileName() ne fait juste que lire le PEB (NtCurrentPeb()), un
peu comme lorsqu'on lit la variable "environ" sous Unix.
1 2