Probleme GetModuleFileName [Résolu]

fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 12:06 - Dernière réponse : cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

24 réponses

Meilleure réponse
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 15:59
3
Merci
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

Merci cs_darunia 3

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de cs_darunia
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 13:00
0
Merci
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
Commenter la réponse de cs_darunia
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 19 oct. 2007 à 13:59
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 14:03
0
Merci
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!
Commenter la réponse de fredsor
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 14:09
0
Merci
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);
Commenter la réponse de fredsor
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 14:11
0
Merci
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
Commenter la réponse de cs_darunia
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 14:25
0
Merci
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 !
Commenter la réponse de fredsor
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 14:28
0
Merci
Tu travailles en Ainsi ou en Unicode ?
Est ce que tu mélanges les 2 ?

D@runia
Commenter la réponse de cs_darunia
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 14:38
0
Merci
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
Commenter la réponse de cs_darunia
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 19 oct. 2007 à 14:38
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 14:58
0
Merci
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 )
Commenter la réponse de fredsor
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 19 oct. 2007 à 15:02
0
Merci
C'est lpPath qui contien le chemin complet et non pPath.

C++ (@++)<!--
Commenter la réponse de SAKingdom
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 15:13
0
Merci
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
Commenter la réponse de cs_darunia
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 19 oct. 2007 à 15:17
0
Merci
"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++ (@++)<!--
Commenter la réponse de SAKingdom
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 15:19
0
Merci
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 ""
Commenter la réponse de fredsor
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 15:25
0
Merci
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...
Commenter la réponse de fredsor
cs_darunia 357 Messages postés mercredi 18 décembre 2002Date d'inscription 24 mars 2011 Dernière intervention - 19 oct. 2007 à 15:38
0
Merci
"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
Commenter la réponse de cs_darunia
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 15:44
0
Merci
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!
Commenter la réponse de fredsor
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 16:29
0
Merci
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
Commenter la réponse de fredsor
fredsor 198 Messages postés lundi 24 avril 2006Date d'inscription 3 avril 2008 Dernière intervention - 19 oct. 2007 à 16:30
0
Merci
quatre lignes en fait, il y a un strtok en trop
hi hi
Commenter la réponse de fredsor

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Probleme GetModuleFileName - page 2