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

C++ Discussion :

Pb avec la fonction DuplicateHandle


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut Pb avec la fonction DuplicateHandle
    Bonjour, j'ai un pb au niveau de la fonction de la fonction : DuplicateHandle sous pocket pc qui renvoie false et le getlasterror : paramètre incorrect alors que sous win32, aucun problème.

    Voici le code :



    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
    58
    59
    60
    61
    62
    cbDialogMemory = GlobalSize( hDialogMemory);
    CallerhFileMem = CreateFileMapping( (HANDLE)0xFFFFFFFF,
                                    NULL,
                                    PAGE_READWRITE,
                                    0L,
                                    cbDialogMemory,
                                    NULL);
    if ( CallerhFileMem == NULL)
        {
        return( G_ERRLOG);
        }
    /* allocation des handle de process */
     
     
     
     
    ServerhProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ServerPID);
    if ( ServerhProcess == NULL)
        {
        CloseHandle( CallerhFileMem);
        return( G_ERRLOG);
        }
     
     
     
     
     
     
     
    CallerhProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, CallerPID);
    if ( CallerhProcess == NULL)
        {
        CloseHandle( CallerhFileMem);
        CloseHandle( ServerhProcess);
        return( G_ERRLOG);
        }
     
    /* creation du handle pour le serveur */
     
     
     
    if ( !DuplicateHandle( CallerhProcess,
                                CallerhFileMem,
                                ServerhProcess,
                                &ServerhFileMem,
                                0,
                                FALSE,
                                DUPLICATE_SAME_ACCESS) )
        {
    		TCHAR szBuffer[20];
    	DWORD error = GetLastError();
    	StringCbPrintf(szBuffer, sizeof(szBuffer), TEXT("Erreur n°%u"), error);
    	TCHAR szErreur[80];
    	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0,
    	 szErreur, 80, NULL
    	 );
    	MessageBox(NULL, szErreur, szBuffer, MB_OK | MB_ICONERROR);
        CloseHandle( CallerhFileMem);
        CloseHandle( ServerhProcess);
        CloseHandle( CallerhProcess);
        return( G_ERRLOG);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HANDLE                          CallerhProcess;
    /* HWND                            CallerhWnd; */
    HANDLE                          CallerhFileMem;
    HWND                            ServerhWnd;
    DWORD                           ServerPID;
    HANDLE                          ServerhProcess;
    HANDLE                          ServerhFileMem;
    void FARPTR                     CallerpFileMem;
    void FARPTR                     pDialogMemory;
    DWORD                           cbDialogMemory;
    merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien, je ne vois rien qui me choque au niveau de DuplicateHandle(), mais il y a un truc qui me chiffone (heurusement sans gravité) : Pourquoi ne passes-tu pas directement INVALID_HANDLE_VALUE à CreateFileMapping au lieu de cette valeur hard-codée de 0xFFFFFFFF castée ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut
    Cela revient-il au même ?
    Hélàs ca ne résout pas mon pb
    Sinon puis-je contourner le pb avec d'autres fonctions ?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut
    alors Médinoc je sais pourquoi ca foire :

    DuplicateHandle can be called by either the source process or the target process. It can also be invoked where the source and target process are the same.

    The duplicating process uses the GetCurrentProcess function to get a handle of itself. To get the other process handle, it may be necessary to use some form of interprocess communication (for example, named pipe or shared memory) to communicate the process identifier to the duplicating process. This identifier is then used in the OpenProcess function to open a handle.

    If the process that calls DuplicateHandle is not the target process, the duplicating process must use interprocess communication to pass the value of the duplicate handle to the target process.

    DuplicateHandle can only duplicate handles to the types of objects in the following table.

    Handle Description
    Event Returned by CreateEvent or OpenEvent.
    Mutex Returned by CreateMutex.
    Semaphore Returned by CreateSemaphore.
    moi j'utilise OpenProcess, comment contourner le pb ?

    merci

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux peut-être utiliser une mémoire partagée nommée, mais alors, il faudra transmettre le nom au serveur (ou un nombre, genre le PID du client, et utiliser une fonction commune qui génère le nom à partir du PID).

    Hélas, je ne connais pas l'API des PocketPC, donc je ne sais même pas si c'est supporté. Si ça se trouve, le DuplicateHandle() des PocketPC ne supporte pas DUPLICATE_SAME_ACCESS ou une c****rie du genre...


    Edit: Je n'avais pas vu ton post précédent, mais il y a cette ligne-là qui m'alarme:
    DuplicateHandle can be called by either the source process or the target process.
    Ton code utilise OpenProcess() pour les deux: Cela veut dire que ta fonction est exécutée par un process qui n'est ni le serveur ni le client ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut
    je suis sous le client.
    Après le serveur recupère le message.
    Pas bcp plus loin d'ailleurs.
    Mais je suis très embetté avec le DuplicateHandle, si quelqu'un sait comment palier ce pb.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu es sur le client, essaie avec GetCurrentProcess() pour le client plutôt que OpenProcess()...

    Et ensuite, vérifie avec des flags spécifiés manuellement, des fois que ce soit DUPLICATE_SAME_ACCESS qui plante (Je n'ai toujours rien trouvé sur DuplicateHandle() sous Pocket PC...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    460
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 460
    Par défaut
    J'ai trouvé la solution ^^, je donnerai la solution plus tard.
    Merci Médinoc pour ton dévouement au passage

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

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  3. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

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