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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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
    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 confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    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 Expert
    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
    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