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

Windows Discussion :

souci avec DrarQueryFile


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut souci avec DrarQueryFile
    Bonsoir,

    J'essaye de faire un petit utilitaire dont le seul but, c'est de recuperer les noms de fichiers (par paquets) qu'on drop sur sa fenetre (a partir de l'explorateur par exemple), puis de lancer un autre utilitaire avec ces fichiers en parametre (ligne de commande), un par un.

    Dans un premier temps, la seconde application se charge de déplacer ces fichiers vers un repertoire donné (pas de soucis de ce coté la, tout marche très bien)

    Le problème que je rencontre, c'est que l'application sur laquelle on drop sempble fonctionner, mais seulement un moment puis se bloque. Je soupconne une fuite de mémoire au niveau du code de mon DragQueryFile, mais je n'arrive pas à trouver pourquoi.

    A moins que j'ai mal utilisé la fonction elle même ?

    Je vous mets un bout de code (j'ai utilisé le projet de base pour une app windows sous dev-cpp, et j'ai juste touché à la winproc, je ne mets doonc que cette dernière)

    Si quelqu'un à une idée, je le remercie d'avance !



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                DragAcceptFiles(hwnd,TRUE);
                break;
            
                
             case WM_DROPFILES:        
                HDROP hDropFiles;
                int   nFile,i;
    
                hDropFiles = (HDROP)wParam;
                nFile = DragQueryFile(hDropFiles,0xFFFFFFFF,NULL,0); // nombre de fichiers si 0xFFF...
    
                for(i=0;i<nFile;i++)
                {
                    char              *nameFile;
                    int               nChar;
                    WIN32_FIND_DATA   dataFile;
                    HANDLE            hFile;
                    
    
                    
                    nChar = 1 + DragQueryFile(hDropFiles,i,NULL,0); // aile du buffer --> NULL
                    nameFile = (char*) malloc(nChar * sizeof(char));
    
                    DragQueryFile(hDropFiles,i,nameFile,nChar);
    
                    ShellExecute
                    (
                        NULL,	// handle to parent window
                        "open",	// pointer to string that specifies operation to perform
                        "ClassURL.exe",	// pointer to filename or folder name string
                        nameFile,	// pointer to string that specifies executable-file parameters 
                        NULL,	// pointer to string that specifies default directory
                        SW_MINIMIZE 	// whether file is shown when opened
                    );
        
                    FindClose(hFile);
                    free(nameFile);
                }
                DragFinish(hDropFiles);
    
                break;
                    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
                
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Selon MSDN :

    If the index value is between zero and the total number of dropped files and the lpszFile buffer address is NULL, the return value is the required size, in characters, of the buffer, not including the terminating null character.
    Donc, au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nameFile = (char*) malloc(nChar * sizeof(char));
    fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nameFile = (char*) malloc((nChar +1) * sizeof(char));
    PS : si le fichier source dont est extrait ce code est un source C (et pas C++), retire le cast du malloc qui ne sert à rien
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nameFile = (char*) malloc((nChar +1) * sizeof(char));
    Merci pour ta réponse vicenzo, mais mon + 1 est bel et bien présent kuste dans la ligne qui précede.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nChar = 1 + DragQueryFile(hDropFiles,i,NULL,0); // aile du buffer --> NULL
    nameFile = (char*) malloc(nChar * sizeof(char));

    PS : si le fichier source dont est extrait ce code est un source C (et pas C++), retire le cast du malloc qui ne sert à rien
    Non, en fait je code en c++, mais dans un premier temps, pour comprendre l'usage des apis, je me sert des exemples que je trouve tels qu'ils sont (donc le plus souvent en C), avant d'essayer de les convertir en c++. Une fois que j'aurais compris coment marche ce dragQueryFile, je remplacerais ce qui est possible avec des std::string and Co.

    Mais la, j'ai beua faire, je vois pas ce qui cloche !

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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