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

MFC Discussion :

Question sur les DLL


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 4
    Par défaut Question sur les DLL
    Bonjour, j'ai deja parcouru le forum et tente d'utiliser

    http://www.developpez.net/forums/viewtopic.php?t=252919

    ca a marche une fois puis plus, j'accede a la DLL, mais je n'arrive pas a acceder aux fonctions, qq'un pourrait m'eclaircir ?

    code pour la 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
    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
    #include <windows.h>
    #include <string>
    using namespace std;
     
    #define DllImport  __declspec( dllimport )
    #define DllExport  __declspec( dllexport )
     
    /* 
    DllClass::DllClass() {} 
    DllClass::~DllClass () {} 
    */ 
     
    char AppName[] = "DLL Screen Tool"; 
    char HelloMsg[] = "Hello, you're calling a function in this DLL"; 
    char LoadMsg[] = "The DLL is loaded"; 
    char UnloadMsg[] = "The DLL is unloaded"; 
    char ThreadCreated[] = "A thread is created in this process"; 
    char ThreadDestroyed[] = "A thread is destroyed in this process"; 
     
    DllExport BOOL APIENTRY DllMain (HINSTANCE hInst	  /* Library instance handle. */ , 
                           DWORD reason					  /* Reason this function is being called. */ , 
                           LPVOID reserved				  /* Not used. */ ) 
    { 
        switch (reason) 
        { 
          case DLL_PROCESS_ATTACH: 
            MessageBox (NULL, LoadMsg, AppName, MB_OK); 
            break; 
     
          case DLL_PROCESS_DETACH: 
            MessageBox (NULL, UnloadMsg, AppName, MB_OK); 
            break; 
     
          case DLL_THREAD_ATTACH: 
            MessageBox (NULL, ThreadCreated, AppName, MB_OK); 
            break; 
     
          case DLL_THREAD_DETACH: 
            MessageBox (NULL, ThreadDestroyed, AppName, MB_OK); 
            break; 
        } 
     
        /* Returns TRUE on success, FALSE on failure */ 
        return TRUE; 
    } 
     
     
    DllExport void TestHello() {
    	MessageBox (NULL, HelloMsg, AppName, MB_OK); 
    }
    code pour le prog
    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
     
    #include <windows.h>
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    char LibName[] = "I:\\C\\HTMLActiveXTools\\Debug\\HTMLActiveXTools.dll"; 
    char Hello[] = "TestHello";
    char Text[]	= "CHTMLTextBox50" ;
    char DllNotFound[] = "Cannot load library"; 
    char AppName[] = "Load Library"; 
    char HelloNotFound[] = "TestHello function not found";
    char TextNotFound[] = "CHTMLTextBox50 function not found";  
     
    HINSTANCE hLib; 
    FARPROC TestHelloAddr;
    FARPROC TestTextAddr; 
    string HTMLLine; 
     
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR CmdLine, int ShowLine) { 
            hLib = LoadLibrary ((LPCTSTR)LibName); 
            if (hLib==NULL) { 
                    MessageBox (NULL, DllNotFound, AppName, MB_OK); 
            } else { 
                    TestHelloAddr = GetProcAddress (hLib, Hello); 
                    if (TestHelloAddr==NULL) { 
                            MessageBox (NULL, HelloNotFound, AppName, MB_OK); 
                    } else { 
                            TestHelloAddr(); // call [TestHelloAddr]; 
                    } // endif 
                    FreeLibrary (hLib); 
            } // endif 
            //ExitProcess (NULL);
        return 0; 
    }

  2. #2
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Vu les namespace et les class, il semblerait que c'est du C++. Si la fonction n'est pas déclarée extern "C", elle bénéficie des conventions d'appel C++ (c'est à dire qu'elle doit s'appeler en fait quelque chose comme @@TestHello@iv).

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 4
    Par défaut Question sur les DLL
    Ok, c'est bien du C++ et donc si je comprends bien,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define DllImport  __declspec( dllimport ) 
    #define DllExport  __declspec( dllexport )
    c'est du caca et je dois utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec ( dllexport ) void TestHello()
    Merci bien.
    Sinon, autre questtion, j'ai réussi en utilisant les MFC a acéder a ma DLL. cependant, lorsque je passe en parametre un int ça marche et lorsque ej passe une string, j'ai une erreur qui me dit que c'est pas bon aprés qu'il m'ai renvoyé le paramètre et que tout ce soit fini...
    La réponse est elle que je doive passer un pinteur sur la string, enfin son adresse (je suis confus avec les pointeurs) et que du coup en en passant juste l'adresse, ma dll modifiera la string et tout sera nikel ?

    Merci d'avance.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    pour les dll voir aussi la faq :
    http://c.developpez.com/faq/vc/?page=DLL#MakeDynDll

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut non
    non cela marche très bien de donner un parametre avec une string mais tu utilise quoi comme string ? CString ? vérifi que tu as bien déclarer les bonne library dans ta DLL

    sinon donne ton code

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 4
    Par défaut passage d'une string dans une DLL
    Bon voici mon code:

    code qui appelle la 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
    18
    19
    20
    21
    22
    23
    24
    25
     
    void CUSEMFCDlg::OnTry_CLICKED() 
    {
    	// code to test Test.dll function:
     
    	// code to display Number
    	int n = fnTest();
    	char sResult[45];
    	sprintf(sResult, "The Number in the DLL is %d", n);
    	MessageBox(sResult, NULL, MB_OK);
     
    /*	// code to sisplay a String
    	string s;
    	s = fnTestCh();
    	MessageBox(s.c_str(), "Traitement string", MB_OK);
    */	
    /*	//code to pass a param
    	string param = "center me!";
    	string p = fnTestParam(param);
    	MessageBox(p.c_str(), "Traitement param", MB_OK); 
    */
    	//code to pass a pointer
    	string param = "HTML Text";
    	CenterMe(&param);
    	MessageBox(param.c_str(), "Traitement param", MB_OK);
    et voici le code dans la DLL (Test.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
    18
    19
    20
    21
    22
    23
    24
     
    TEST_API int fnTest()
    {
    	return 492;
    }
     
    TEST_API string fnTestCh(void)
    {
    	string c_txt = "<% Bonjour %>";
    	return c_txt;
    }
     
    TEST_API string fnTestParam(string _string)
    {
    	string c_txt = "<center>" + _string + "</center>";
    	return c_txt;
    }
     
     
    TEST_API void CenterMe(string* _str){
    	string var	;
    	var = "<CENTER>" + *_str + "</CENTER>";
    	*_str = var;
    }
    j'ai le test.h de la Dll dans le project usedll et
    toutes les fonctions:
    - fnTest()
    - fnTestCh(void)
    - fnTestParam(string _string)
    fonctionnent mais renvoient un erreur juste apres et je dois quitter l'application.
    debug assertion failed
    cette erreur n'apparait pas lorsque j'utilise fntest (qui ne renvoie qu'un INT)

    cela dit lorsque j'essaye de passer un param et d'appeler centerme, j'ai l'erreur direct.

    voila.
    Sinon, mon but c'est de creer une DLL ActiveX (pour l'utiliser en ASP)
    arretez moi dessuite si je ne suis pas sur le bon chemin !! parceaue DLL ActivX en C++ je ne trouve pas bcp de doc dessus, c plutot VB.

    en tout cas merci bien

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut Essaye avec les CString chez moi ça marche
    Essaye avec les CString chez moi ça marche

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 4
    Par défaut
    Bon, j'ai d'autres trucs a finir juste maintenant, mais des que j'ai fini, je me rappelle comment CString marche et je teste et vous tiens au courant.

    Mais rassurez moi, je vais bien pouvoir faire une "ActiveX DLL" avec tout ca ? (sinon je laisse tomber )

    Merci en tout cas pour ces reponses

Discussions similaires

  1. Questions sur les DLLs
    Par DeLaFonk dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2012, 13h57
  2. 2 questions sur les Library DLL
    Par CodeMan dans le forum C#
    Réponses: 10
    Dernier message: 12/09/2008, 17h28
  3. Question sur les usercontrols et la dll generee
    Par fripon dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/01/2007, 11h42
  4. plusieurs questions sur les Dll
    Par mnaulet dans le forum Windows
    Réponses: 4
    Dernier message: 07/08/2006, 08h39
  5. Question sur les dll
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 29/04/2005, 17h36

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