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++Builder Discussion :

Problème de DLL.


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Problème de DLL.
    Hello,

    J'ai un petit problème dans l'utilisation d'un DLL que je crée.

    Voici le code dans ma DLL :

    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
    #include <stdarg.h>
     
    extern "C"__declspec(dllexport) __stdcall int Insert(AnsiString NomTable, ...);
     
    int __stdcall Insert(AnsiString NomTable, ...)
    {
         int total = 0;
         va_list params;
         AnsiString arg;
     
         va_start(params, NomTable);
         while (va_arg(params, AnsiString) != 0)
         {
            total ++;
         };
         return total;
    };
    Comme vous le remarquez, il s'agit d'une fonction avec un nombre de paramètres variables.

    D'une autre application, j'essaie d'appeler cette fonction dans ma DLL (que je charge dynamiquement). 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
    #include <stdarg.h> 
         typedef int (__stdcall * MYDLLPARAMS) (AnsiString NomTable, ...);
     
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     
         MYDLLPARAMS impfuncparams;
    HINSTANCE hinstdll;
          int iret;
     
          if ((hinstdll = LoadLibrary("DB.DLL")))
          {
            impfuncparams = (MYDLLPARAMS) GetProcAddress (hinstdll, "Insert");
            if (impfuncparams)
            {
                    iret = impfuncparams("TEST", "TEST1", "TEST2");
            };
            FreeLibrary(hinstdll);
     
          };
     
    }
    Mon problème est le suivant : lors de l'appel à la fonction GetProcAddress, j'ai un retour NULL, ce qui veut dire que ma fonction n'est pas trouvée dans la DLL. Si je retire le fait qu'il y ait des paramètres variables, cela fonctionne sans problème. Quelqu'un peut-il m'aider afin de savoir comment appeler une fonction ayant des paramètres variables dans un DLL ?

    Merci.

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 042
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 042
    Points : 8 252
    Points
    8 252
    Par défaut
    Essais _Insert au lieu de Insert dans GetProcAddress

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    impfuncparams = (MYDLLPARAMS) GetProcAddress (hinstdll, "_Insert");
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    CGI a parfaitement raison de plus le code dans ta DLL est défectueux
    si tu désire retournenr le nommbre d'éléments dans ta liste de paramètre il vaut mieux utiliser le code suivant
    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
     
    extern "C" __declspec(dllexport) __stdcall int Insert(char* NomTable, ...);
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    int __stdcall Insert(char* NomTable, ...)
    {
         int total = 0;
         va_list params;
         char*  arg;
     
         va_start(params, NomTable);
         while (va_arg(params, char) != 0)
         {
            total ++;
         }
         return total;
    }
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. [Win2000]Problème API, DLL ou... ?
    Par izacalva dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 24/06/2006, 21h10
  2. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  3. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43
  4. Problème de dll à l'execution
    Par gege2061 dans le forum Windows
    Réponses: 3
    Dernier message: 11/03/2005, 11h22
  5. problème execution dll
    Par semenzato dans le forum MFC
    Réponses: 15
    Dernier message: 19/12/2003, 16h40

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