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 XP Discussion :

API32 et appel DLL


Sujet :

Windows XP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut API32 et appel DLL
    Bonjour,
    Je voudrais, depuis mon programme principal lancer une fonction qui se trouve dans une dll en lui passant un paramètre.
    Tout d’abord quand je ne passe pas de paramètre, je fais ceci et ça marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- FARPROC dllEntryAdd1;
    2.- hinstdll = LoadLibrary(lpchemindll);
    3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
    4.- dllEntryAdd1(); // ici ma dll chargée dans mon prog principal démarre correctement
    Lorsque je veux passer un paramètre j’obtiens des erreurs de compil sur le prog ppal (donc sans rapport avec la présentation côté dll puisque je ne vais pas jusqu’au link) !
    Lorsque je modifie uniquement la ligne 4 comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- FARPROC dllEntryAdd1;
    2.- hinstdll = LoadLibrary(lpchemindll);
    3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
    4.- dllEntryAdd1(lpbuffer);
    J’obtiens l’erreur de compile suivante : « Extra parameter » sur la ligne 4
    Lorsque je modifie la ligne 1 et 4 comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- FARPROC dllEntryAdd1(LPTSTR); //ou encore : FARPROC dllEntryAdd1(char *p);
    2.- hinstdll = LoadLibrary(lpchemindll);
    3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
    4.- dllEntryAdd1(lpbuffer);
    J’obtiens l’erreur de compile suivante : « Lvalue required » sur la ligne 3
    Lorsque je modifie les lignes 1, 3 et 4 comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1.- FARPROC dllEntryAdd1(LPTSTR); //ou encore : FARPROC dllEntryAdd1(char *p);
    2.- hinstdll = LoadLibrary(lpchemindll);
    3.- dllEntryAdd1(lpbuffer) = GetProcAddress(hinstdll, dllEntrySet);
    4.- dllEntryAdd1(lpbuffer);
    J’obtiens encore l’erreur de compile suivante : « Lvalue required » sur la ligne 3
    Je sais bien que ce dernier exemple est farfelu, ou peut-être que j’aurais dû mettre cette question dans le forum programmation c++ ?
    Help per favor
    Thanks

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tu as un problème de déclaration de pointeur de fonction et de cast.

    Lorsque tu déclares ton ptr de fonction comme ceci :
    cela signifie que ta fonction est du type Lorsque tu déclares ton ptr de fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FARPROC dllEntryAdd1(LPTSTR);
    cela signifie que ta fonction est du type Lorsque tu récupères l'adresse de ta fonction avec GetProcAddress(), tu récupère un ptr de fonction du type FARPROC et donc Si tu veux mettre ce pointeur dans une variable d'un autre type, il faut obligatoirement caster.

    En fait, quand je dois travailler avec des pointeurs de fonction, systématiquement, je créé un type pour cette fonction. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // déclaration d'un ptr de fct qui retourne void et qui attent un paramètre int et char *
    typedef void (*MonPtrFct_t)(int, char *);
    
    // définition du pointeur de fonction
    MonPtrFct_t dllEntryAdd1;
    
    // chargement de la DLL
    hinstdll = LoadLibrary(lpchemindll);
    
    // récupération du pointeur
    dllEntryAdd1 = (MonPtrFct_t)GetProcAddress(hinstdll, dllEntrySet);
    Pour info, dans windef.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define WINAPI  __stdcall
    typedef int (FAR WINAPI *FARPROC)();

    PS : cette discussion aurait eu une meilleure visibilité dans un forum de programmation (Windows ou C)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut API32 et appel DLL
    Merci,
    Je n'ai pas répondu tout de suite car depuis tout à l'heure je cherche à comprendre l'explication, il faut que je retrouve une doc. Je n'avais pas conscience que je voulais mettre un pointeur dans une variable d'un autre type. Ce qui m'intéressait c'était au moment où dans mon programme principal je lance l'exécution de ma fonction en dll de lui passer en paramètre l'adresse d'un buffer (lpbuffer) qui se trouve dans le programme principal afin que ma fonction dll puisse aller lire ce buffer. Dans l'exemple, je ne vois pas à quel endroit je lance l'exécution de la dll, ni comment je lui passe l'adresse de ce buffer. Mais c'est probablement qu'il faut que je retourne vers des cours. Je vais réessayer de comprendre.
    Cordialement,

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut API32 et retour DLL
    Je crois que j'ai à peu près compris maintenant, j’ai fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef INT (WINAPI* PMAFONCTION)(char* );
    PMAFONCTION dllEntryAdd1;
    dllEntryAdd1 = (PMAFONCTION)GetProcAddress(hinstdll, dllEntrySet);
    iret=dllEntryAdd1(lpcheminlog);
    et ça marche impeccable merci, sauf que maintenant j’ai un problème dans ma DLL,
    mais peut-être vas-tu me dire que c’est normal :

    Dans mon point d’entrée ci-dessus (dllEntryAdd1) de ma dll, je me contente de récupérer l’adresse lpcheminlog qui est l’adresse dans mon programme principal du chemin d’un fichier dans lequel ma dll écrira un peu plus tard et je fais passer cette adresse en variable globale de ma dll (Nomfichier = lpcheminlog) (Nomfichier est une variable globale). Je me contente ensuite toujours dans le même point d’entrée de ma dll de lancer un hook pour récupérer les touches du clavier et je reviens immédiatement dans mon programme principal qui lui contient la boucle Getmessage.
    Il faut préciser que la callback de traitement des touches se trouve dans ma dll et c’est elle qui ira écrire dans le fichier dont le chemin est dans le programme principal et l’adresse de ce chemin en variable globale de ma dll.
    Je tape une ou deux touches tout se passe bien, puis tout à coup la variable globale de ma dll (Nomfichier) perd l’adresse du buffer du programme principal qui contient le nom du fichier. Est-ce normal ? J’ai essayé de mettre Nomfichier en variable static mais ça ne change rien !
    Faut-il que je recopie le chemin du fichier (et pas seulement son adresse) dans une variable globale de ma dll ?
    Merci

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

Discussions similaires

  1. Appel dll COM en C
    Par syl63 dans le forum C
    Réponses: 9
    Dernier message: 05/07/2006, 14h23
  2. [WinService][C#] Comment appeler dll C/C++ ?
    Par avrama dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/01/2006, 12h05
  3. Appel Dll Ecrite en C++
    Par scelines dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 26/07/2005, 11h58
  4. appel DLL C++ en Delphi (pb avec type)
    Par fkerbourch dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 17h31
  5. [MFC]ActiveX + appel DLL
    Par Xeron dans le forum MFC
    Réponses: 4
    Dernier message: 22/06/2005, 16h39

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