Probleme GetModuleFileName

Résolu
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 19 oct. 2007 à 12:06
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 - 22 oct. 2007 à 10:25
Salut a vous!!

Je vous sollicite car j'ai un probleme : je dev en C sous Embedded Visual C++ (windows CE)
J'ai un exe Projet_Falcon.exe, qui s'appuie sur des données presentes dans un Projet_Falcon.ini

mon souci, c'est que je veux qu'il lise bien le ini, et ce sans donner un chemin en dur.
Donc j'ai utilisé GetModuleFileName ainsi :
    TCHAR chemin[100];
    GetModuleFileName(0,chemin,MAX_PATH);

Cela me renvoit  : \Storage Card\Projet_Falcon.exe
Le souci c'est que ensuite, je veux lire le fichier present donc à l'emplacement \Storage Card\Projet_Falcon.ini
Or, le probleme c'est qu'il n'y arrive pas, puisque les "" doivent être doublés!
Et j'en arrive a mon probleme : pour remplacer tout les "" par des "\", le compilateur me balance : error C2001: newline in constant
    (exemple : if(chemin[i]!=="")  =>error C2001: newline in constant

Si quelqu'un a une idée, ou croit que j'ecris des enormités, faites moi signe SVP, je vois pas trop là comment contourner le probleme

Merci d'avance!

24 réponses

cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 15:59
Lorsque tu ecris "\", le compilo le traduit en 92 (code ascii du \)
On double le \ car il sert de caractere d'echappement.

La chaine que tu recoit de GetModuleName contient aussi des caracteres à 92, sauf que en affichage printf te l'affiche en \

D@runia
3
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 13:00
Salut,



if(chemin[i]!=="") 

est effectivement une enormité :

- l'operateur !==, c'est comment dire ... bizarre. j'aurais plus vu !=
- chemin[i] représente un char. Tu dois tester avec la valeur '\' et pas ""

Sinon je comprends pas bien ton problème avec les \.
Dans ton cas tu as juste a faire :

strcpy(strstr(chemin, ".")  + 1, "ini)

Et le tour est joué !

D@runia
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 oct. 2007 à 13:59
char lpPath[300], *pPath = lpPath+GetModuleFileName(0, lpPath, 300);

while(*--pPath != '.');
if(pPath >lpPath) *(DWORD*)++pPath 0x00696E69;

Et voilà. lpPath contiendra le chemin vers le ini.
   

C++ (@++)<!--
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 14:03
Merci darunia pour la réponse

Pour le !== excuse, cest une faute de frappe pour l'exemple, evidemment que cela ne passe pas.

Sinon tester avec '\', j'avais également essayer, mais il n'aime pas mieux : if(chemin[i]=='\')             =>  error C2001: newline in constant

Enfin, ton strcpy ne fonctionne pas mieux, puisque le resultat de
strcpy(strstr(chemin, ".")  + 1, "ini)
donne "ini" tout simplement (strstr donne ce qui se trouve apres le ".".

Moi j'ai fais
char* cheminFichier = strtok(chemin,".");
cheminIni=strcat(cheminFichier,".ini");

et ca donne bien \Storage Card\Projet_Falcon.ini, mais moi je veux \\Storage Card\\Projet_Falcon.ini !!
Car apres sinon il ne peux ouvrir le fichier à l'emplacement, si les '\' ne sont pas doublés

Si quelqu'un voit comment faire, help!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 14:09
Oups SAKingdom j'avais pas vu ta réponse
Par contre ca compile bien, mais le programme ne bouge plus arrivé a tes instructions...

Peux tu m'expliquer en gros en quoi ca consiste, j'avoue ne pas connaitre "*--pPath", "0x00696E69"

Voila comment je l'ai utilisé

    char lpPath[300];    char *pPath lpPath+GetModuleFileName(0, ConvertAnsiToUnicode(lpPath), 300);>Convert... passe de l'ascii en unicode

    while(*--pPath != '.');
    if(pPath >lpPath) *(DWORD*)++pPath 0x00696E69;

    EcrireFichierBidon("pPath");  =  > pour ecrire dans un fichier genre debug
    EcrireFichierBidon(pPath);
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 14:11
Il ne faut pas regarder ce que renvoi strcpy, mais le contenu de la variable chemin apres le strcpy !
Pour le '\' autant pour moi, il faut le doubler : '\\'

En ce qui concerne les \, il doivent etre doublés si tu le met en constante dans ton source.
Si en execution, un affichage de chemin affiche
\Storage Card\Projet_Falcon.ini alors c'est correct, je ne vois pas ou est le probleme

D@runia
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 14:25
Re Darunia,

Je n'arrive pas à declarer le '\'
J'ai essayé de passer par "define", par "const char", rien n'y fait il me mets newline in constant!!

Pour le chemin \Storage Card\Projet_Falcon.ini, je suis d'accord avec toi, il est correct, cependant par la suite dans le code je fais un
            FILE *file=_tfopen(chemin, TEXT("wt"));

et là ce chemin doit avoir les '\' doublées.
J'ai pas les yeux en face des trous ou quoi lol
Au pire aurait tu un exemple , pour définir le '\' et le remplacer par '\\' à chaque fois qu'on le rencontre dans une chaine?
Merci !
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 14:28
Tu travailles en Ainsi ou en Unicode ?
Est ce que tu mélanges les 2 ?

D@runia
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 14:38
Autant pour moi, j'avais pas vu que t'etais en TCHAR.
Il est impossible de remplacer '\' par '\\' car :

'\' n'existe pas, il sert pour les sequences d'echappement :

 http://msdn2.microsoft.com/en-us/library/h21280bw(VS.80).aspx

'\\' = \ en execution.

Si ton fopen foire sur chemin, c'est pour une autre raison.
http://msdn2.microsoft.com/en-us/library/h21280bw%28VS.80%29.aspx
D@runia
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 oct. 2007 à 14:38
Non la tu melanges ansi et unicode.

Voici une version unicode:

WCHAR lpPath[300], *pPath = lpPath+GetModuleFileNameW(0, lpPath, 300);

while(*--pPath != '.');

if(pPath >= lpPath) {
    *(DWORD*)++pPath = 0x006E0069;    *(DWORD*)(pPath +2) 0x00000069;
}

0x00696E69 c'est la valeur hexa de "ini\0" en sens inverse (car on travail dans le stack)

C++ (@++)<!--
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 14:58
Merci pour vos reponses,
En effet je dois sans doute confondre certains choses...
Car maintenant j'arrive bien à créer ma chaine \\Storage Card\\Projet_Falcon.ini,

    TCHAR chemin[100];
    TCHAR path[100];
    GetModuleFileName(0,chemin,MAX_PATH);
    int j=0;
    for(int i=0; i<strlen(ConvertUnicodeToAnsi(chemin)-1); i++)
    {
        if(chemin[i]=='\\')        {
            path[j]= chemin[i];
            j++;
            path[j]= chemin[i];
            j++;
        }        else        {
            path[j]= chemin[i];
            j++;
        }    }

Mais il ne veut plus ouvrir le fichier
avant je mettais en dur :
char* cheminIni="\\Storage Card\\Projet_Falcon.ini";
et ensuite je faisais FILE* file = _tfopen(ConvertAnsiToUnicode(cheminIni),TEXT("rb")); // ouverture du fichier en binaire

et maintenant, bien que je recréé bien \\Storage Card\\Projet_Falcon.ini dans le char* cheminIni, il pase en erreur a chaque fois
Je suis pommé là
( ton code SAKingdom me renvoi le chaine "i" seulement )
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 oct. 2007 à 15:02
C'est lpPath qui contien le chemin complet et non pPath.

C++ (@++)<!--
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 15:13
Tu n'as pas besoin de double ces satanés \ ....

Enfin bref, fait appel à la fonction

_get_errno  pour savoir le code erreur.

D@runia
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 oct. 2007 à 15:17
"Tu n'as pas besoin de double ces satanés \ ...."
A non ?

[auteur/FREDSOR/755859.aspx fredsor] >> Je ne crois pas que tu devrais programmer en UNICODE pout l'instant. Tu n'as pas l'air de bien maitriser certains concepts et ça pourrait causer beaucoup de problèmes (comme en ce moment même).
Pour maintenant, vaut mieux rester en ansi. Bien plus simple.

C++ (@++)<!--
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 15:19
Si si je dois les doubler, la preuve puisque si je les double pas, ca ne fonctionnait pas
Peut etre que mes strcat m(ont approté des erreurs?

Quant a ton code SAKingdom, en effet, tu créé bien \storage card\projet_falcon.ini
mais là je ne vois pas pourquoi ca me rejette avec mes double ""
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 15:25
Pour l'unicode j'ai pas eu le choix, le pocket pc requiere sont usage je pense
Et pour l'instant je n'ai pas eu d'autre probleme ^^

Je vais voir, sinon je laisserais les chemins en "dur", mais c'est pas propre quoi...
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
19 oct. 2007 à 15:38
"Tu n'as pas besoin de double ces satanés \ ...."
A non ?

Pas en execution.



Si si je dois les doubler, la preuve puisque si je les double pas, ca ne fonctionnait pas

Ca fonctionne alors finalement ?

D@runia
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 15:44
Non Darunia
Je m'explique plus clairement :
si je fais
    char* cheminIni="\\Storage Card\\Projet_Falcon.ini";
    void LireFichierIni()
    {
            FILE* file = _tfopen(ConvertAnsiToUnicode(cheminIni),TEXT("rb")); // ouverture du fichier en binaire
            if(file!=NULL)
            {
                ...
             }
             else{
                      ERREUR
            }

    Alors ca marche

Maintenant je ne veux plus mettre le chemin en dur, d'ou mon GetModuleFileName
Or celui me recupere "\StorageCard\Projet_Flacon.ini"
Je fais ma boucle comme expliquer plus haut, ce qui me redonne "\\Storage Card\\Projet_Falcon.ini"

Mais là si je rappelle la procedure "LireFichierIni()", je passe dans la condition "else" =>ERREUR

Il y a forcément un truc pas clair, puisque le chemin est le même normalment!
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 16:29
Et dire que depuis le debut tu disais ca et que je faisais la sourde oreille ^^
Au final je me retrouve avec seulement 5 lignes de codes, et ca fonctionne!!

    TCHAR chemin[100];
    GetModuleFileName(0,chemin,MAX_PATH);
    strtok(ConvertUnicodeToAnsi(chemin),".");
    cheminIni=strcat(strtok(ConvertUnicodeToAnsi(chemin),"."),".ini");

Merci beaucoup a vous deux pour le temps consacré, je me serais entété sur ces fameux \...
Merci encore Darunia, le weekend va sembler meilleur
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
19 oct. 2007 à 16:30
quatre lignes en fait, il y a un strtok en trop
hi hi
0
Rejoignez-nous