IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Problème avec CCommandLineInfo


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    liv
    liv est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par défaut Problème avec CCommandLineInfo
    Bonjour à tous !

    Voilà...Lorsque je double clique sur un fichier spécifique cela ouvre mon programme tout en lui passant le nom de fichier double-cliqué en paramètre.
    Jusque là tout est normal...et ça marche.

    Le problème est que mon fichier passé en paramètre est "tronqué" à la mode DOS. Vous voyez ? Avec le caractère ~ un peu partout...et les noms racourcis...
    Cela rend l'exploitation du fichier un peu délicate sous mon programme.

    Est-ce que quelqu'un aurait une idée pour disposer sous mon prog du chemin et du nom réels de mon fichier double-cliqué ?

    Est-ce qu'il y a une méthode appliquable dans la fonction CCommandLineInfo ?
    Existe-il une fonction permettant de transformer l'écriture DOS en la réelle ?

    PS: Je suis sous Visual C++ en MFC

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, utilise GetLongPathName

  3. #3
    liv
    liv est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par défaut
    Merci à toi !

    J'ai toutefois un petit problème...peux tu jeter un coup d'oeil à ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	CWzdCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
     
    	DWORD szTempName = MAX_PATH;
     
    	LPTSTR lpszLongPath = "";
    	GetLongPathName(cmdInfo.m_File.GetBuffer(), lpszLongPath, szTempName);
     
    	MessageBox(0, lpszLongPath, "Mon prog",NULL);
    PS: La variable cmdInfo.m_File est de type CString.

    L'erreur retournée en gros est "La mémoire ne peut pas être writen".
    Je sais que c'est un problème de conversion au niveau de la fonction GetLongPathName avec la variable m_File mais je n'arrive pas à y remédier.

    As-tu une idée?


    La fonction GetLongPathName est définie comme suit:

    DWORD GetLongPathName(
    LPCTSTR lpszShortPath, // file name
    LPTSTR lpszLongPath, // path buffer
    DWORD cchBuffer // size of path buffer
    );

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    essaie voir un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    		char *nomLong = new char[MAX_PATH];
    		if (!GetLongPathName(cmdInfo.m_File,nomLong,MAX_PATH))
    		{
    			LPVOID lpMsgBuf; 
    			FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &lpMsgBuf, 0, NULL); 
    			MessageBox(NULL,(LPCTSTR)lpMsgBuf,"",MB_ICONSTOP); 
    			LocalFree( lpMsgBuf ); 
    		}
    		cmdInfo.m_File = nomLong;

  5. #5
    liv
    liv est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par défaut
    Merci ça marche niquel.

    Par contre je n'ai pas tout compris. J'ai bien vu la différence au niveau du type de la variable nomLong qui est char * et non plus LPTSTR.

    Pourquoi ça ne marche pas avec LPTSTR ? Et puis le reste dans ta condition (si pas respectée), je ne l'ai pas trop compris non plus.

    En tous cas merci...!

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tout simplement parce que LPTSTR est un pointeur vers une chaine de caractères (char *), et utilisé comme ca, il n'est ni défini, ni alloué, donc tu essaies d'écrire n'importe où en mémoire, d'où l'erreur La mémoire ne peut pas être writen

    Pour info, une fois que tu as recopié le nomLong dans ton CString, il faut le supprimer avec
    Et la condition dans les accolades est simplement qu'en cas d'erreur, il t'affiche une erreur avec le message correspondant

  7. #7
    liv
    liv est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par défaut
    Merci pour tes explications...c'est très clair maintenant !

    Si tu as encore un peu de temps à me consacrer connais-tu une méthode de gestion d'ouverture d'application ?
    Je m'explique...

    Je double-clic sur mon fichier -> ouverture de mon programme avec le fichier double-cliqué.
    Je re-double-clic sur un autre fichier -> re-ouverture de mon programme avec cet autre fichier.

    En gros...j'ai autant de programmes ouverts que de fichiers double-cliqués !
    Comme tu peux t'en douter je souhaiterais comme sous Winamp ou Windows Media Player avoir un seul et unique programme d'ouvert pour n fichiers double-cliqués...une gestion de rechargement par exemple.

    Je suis en train de me demander si cela ne peut pas se gérer sous la base de registre Windows...au niveau des clés HKCR. Si on peut spécifier de ne pas ré-ouvrir un programme déjà ouvert ?!

    Sinon...je ne vois que la solution de gestion au niveau VC++...de réouvrir le programme, de vérifier si il n'est pas déjà ouvert et de balancer à l'instance déjà existante mon nouveau fichier double-cliqué. Si c'est la solution la meilleure sais tu comment on fait pour balancer le fichier en ligne de commande à cette instance déjà existante?

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je le ferais aussi à partir de VC

    je m'inspirerai de la FAQ pour detecter s'il y a plusieurs instances de mon programme http://c.developpez.com/faq/vc/?page...NoMoreInstance et dans ce cas, j'enverrai un message perso à mon appli (WM_COPYDATA) déjà ouverture pour lui dire d'ouvrir un nouveau fichier

  9. #9
    liv
    liv est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Par défaut
    Ok...c'est le message WM_COPYDATA qui m'intéressait.
    Je vais jeter un coup d'oeil...merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo