begin process at 2012 05 28 07:50:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Driver

 > 

Charger des fonctions depuis une dll


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Charger des fonctions depuis une dll

mercredi 8 avril 2009 à 12:02:48 | Charger des fonctions depuis une dll

HeXa2

Bonjour!

Je viens de finir de compiler une DLL: H2BUSDLL.dll
cette dll a pour but de gerer une communication sur le port com (que je vais interfacer avec un autre soft apres).

Pour le moment, je veux la tester, donc j'ai créé un nouveau projet testH2bus sous VC++

J'ai trouvé pas mal de petits bouts de code sur le net et j'ai fait un peu de tetris pour parvenir a une solution qui marche bien.. ou plutot qui devrait bien marcher...

je vous met les infos:

dans le .def de ma dll:
; H2BUSDLL.def : déclare les paramètres de module pour la DLL.

LIBRARY      "H2BUSDLL"
EXPORTS
    init_com        @1
    write_data_s    @2
    write_data_m    @3
    read_data_s        @4
    read_data_m        @5
    end_com         @6

dans mon code de testH2bus.cpp:
HINSTANCE H2busdll;

 uint LoadH2busdll()
 {
     int LoadStat=0;
 
     H2busdll=::LoadLibrary("H2BUSDLL.dll" );
     if(H2busdll!=NULL)
     {
         (FARPROC) init_com= GetProcAddress(H2busdll, "init_com" );
         if(init_com!=NULL)
         {
            (FARPROC) write_data_s=GetProcAddress(H2busdll, "write_data_s" );
       
            if(write_data_s!=NULL)
            {
                (FARPROC) write_data_m=GetProcAddress(H2busdll, "write_data_m" );
       
                if(write_data_m!=NULL)
                {
                    (FARPROC) read_data_s=GetProcAddress(H2busdll, "read_data_s" );
       
                    if(read_data_s!=NULL)
                    {
                        (FARPROC) read_data_m=GetProcAddress(H2busdll, "read_data_m" );
       
                        if(read_data_m!=NULL)
                        {
                            (FARPROC) end_com=GetProcAddress(H2busdll, "end_com" );
                           
                            if (end_com!=NULL)
                        {
                            LoadStat=1; /* Flag de chargement correct */
       
                            }}}}}}
       
                 if(!LoadStat)
                 {
                                 printf("Erreur de chargement du pilote (H2BUSDLL.DLL)\n" );          
                 }
         }
         else // ie (H2BUSDLL == 0)
         {
                 printf("Impossible de charger le pilote (H2BUSDLL.dll)\n" );
         }
   
     return (LoadStat);  
    }

Et bien sur, les erreurs qu'il me renvoit:
1>------ Début de la génération : Projet : testH2BUS, Configuration : Debug Win32 ------
1>Compilation en cours...
1>testH2BUS.cpp
1>.\testH2BUS.cpp(29) : error C2664: 'LoadLibraryW' : impossible de convertir le paramètre 1 de 'const char [13]' en 'LPCWSTR'
1>        Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
1>.\testH2BUS.cpp(32) : error C2106: '=' : l'opérande gauche doit être une l-value
1>.\testH2BUS.cpp(35) : error C2106: '=' : l'opérande gauche doit être une l-value
1>.\testH2BUS.cpp(39) : error C2106: '=' : l'opérande gauche doit être une l-value
1>.\testH2BUS.cpp(43) : error C2106: '=' : l'opérande gauche doit être une l-value
1>.\testH2BUS.cpp(47) : error C2106: '=' : l'opérande gauche doit être une l-value
1>.\testH2BUS.cpp(51) : error C2106: '=' : l'opérande gauche doit être une l-value
1>Le journal de génération a été enregistré à l'emplacement "\\..\Mes documents\Visual Studio 2008\Projects\testH2BUS\testH2BUS\Debug\BuildLog.htm"
1>testH2BUS - 7 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

l'erreur C2664 est au niveau de "  H2busdll=::LoadLibrary("H2BUSDLL.dll" ); "
La je pense que l'erreur est corigeable facilement en definissant un "CWSTR" et en envoyant l'adresse d'un pointeur qui va dessus
mais pour toutes les erreurs suivantes, je suis un peu perdu.... au niveau des "   (FARPROC) read_data_s=GetProcAddress(H2busdll, "read_data_s" );  "
il me dit que je ne peux pas alors que je suis en train de definir les fonctions
pour la msdn, c'est une erreur du genre 1=a au lieu de a=1..mais je suis pas du tout convaincu que cel apuisse venir de la

Un coup de main ca serait cool
Mici
HeXa


mercredi 8 avril 2009 à 13:51:27 | Re : Charger des fonctions depuis une dll

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

1>.\testH2BUS.cpp(29) : error C2664: 'LoadLibraryW' : impossible de convertir le paramètre 1 de 'const char [13]' en 'LPCWSTR'

La fonction est terminée par un W -> donc tu es en train de faire de la compilation en unicode. Tu peux passer à a de la compilation MBCS dans la configuration de ton projet; ou faire une include de tchar.h et utiliser la macro _T pour ajouter un L devant la chaîne.

LoadLibrary(_T("H2BUSDLL.dll"));

A quoi servent tes :: avant le LoadLibrary ??

1>        Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction

Mouarf. Comprend pas grand chose. Tu peux pas faire du C plutôt ?

Tu es bien avancé de récupérer du FARPROC. Pourquoi ne pas récupérer directement la fonction ?

Jette un oeil là dessus.


mercredi 8 avril 2009 à 14:40:55 | Re : Charger des fonctions depuis une dll

HeXa2

A quoi servent tes :: avant le LoadLibrary ??
euh... a rien..la fonction a une portée globale, donc ca revient au meme..

j'ai jetté un oeil au lien (wiki) mais je ne suis pas plus avancé. apparement, le codeur a definit un type spécifique pour la fonction... je peux faire la meme chose mais ca m'a pas l'air tres leger a mettre en oeuvre.

Est ce que c'est la bonne solution?

Ca doit pas etre si compliqué de definir des fonctions dans un soft avec la definition qui est contenue dans une dll, sachant que la dll a été developpée par moi-meme...
mercredi 8 avril 2009 à 14:44:18 | Re : Charger des fonctions depuis une dll

rt15

Membre Club Administrateur CodeS-SourceS
"le codeur a definit un type spécifique pour la fonction..."

C'est mieux : pour appeler ta fonction, il va te falloire son proto ! Tu n'es pas très avancé avec ton FARPROC.
mercredi 8 avril 2009 à 14:48:02 | Re : Charger des fonctions depuis une dll

HeXa2

donc typiquement avec 6 fonctions a appeler, il faut definir 6 structures d'appel avec le nombre d'argument qui va bien?

Je pensais que ca rendait un code pas tres "clean", de plus il s'avere que je ne sais pas exactement ce qu'est un farproc (j'ai lu des bribes d'informations sur les pointeurs distants en win3.x mais ca s'arrete la).

Bon, je vais definir mes structures et je vous tient au courant

Mici
mercredi 8 avril 2009 à 18:56:33 | Re : Charger des fonctions depuis une dll

ghuysmans99

Membre Club
Faut le dire, t'es pas forcément obligé d'utiliser ta DLL comme ça ...
Tu peux aussi faire comme cela :
#include "LeHeaderDeMaDLL.h"
#pragma comment(lib,"LeFichierLibDeMaDLL.lib")
...

Et tu n'as plus rien à faire : il te suffit d'appeler tes fonctions comme si elles étaient dans ton source.
Signature.gif
jeudi 9 avril 2009 à 09:07:44 | Re : Charger des fonctions depuis une dll

HeXa2

Serieux???

meme pas les extern "c" toussa toussa...??
Jvais tester ca des tout de suite
jeudi 9 avril 2009 à 11:22:28 | Re : Charger des fonctions depuis une dll

HeXa2

Salut!

Bon, ca n'a pas l'air de fonctionner.
Lorsque je fais juste la déclaration des fonctions, ca compile parfaitement.
mais des que j'utilise une des fonctions (ici init_com) il me renvoit deux erreurs au linkage:

1>tstBUS.obj : error LNK2028: jeton non résolu (0A00000F) "unsigned int __clrcall init_com(char * const,unsigned int)" (?init_com@@$$FYMIQADI@Z) référencé dans la fonction "private: void __clrcall tstBUS::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@tstBUS@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>tstBUS.obj : error LNK2019: symbole externe non résolu "unsigned int __clrcall init_com(char * const,unsigned int)" (?init_com@@$$FYMIQADI@Z) référencé dans la fonction "private: void __clrcall tstBUS::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@tstBUS@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)


Est ce que ca peut venir du fait que le compilateur décore les symboles de mes fonctions?
Besoin que je fournisse plus d'elements?
Dans tous les cas, merci beaucoup de tous ces conseils
jeudi 9 avril 2009 à 11:42:04 | Re : Charger des fonctions depuis une dll

rt15

Membre Club Administrateur CodeS-SourceS
__clrcall

On va pas être copains ! Tu compile en dotnet. Je n'ai pas la moindre idée des conséquences de cela pour la compilation d'une dll.

ghuysmans99 te propose une liaison statique avec ta dll. C'est aussi expliqué sur la page wikipedia de mon lien plus haut. Il te faut notemment __declspec(dllimport).

Après tu peux mettre le extern "C" ou pas... Si c'est des fonctions compliquées et genre en __clrcall, alors il risque de ne pas le falloire. Si c'est des fonctions bateaux (init_com(char * const,unsigned int), c'est pas méchant), tu peux mettre le extern "C", pour ne pas avoir de déco et ainsi faciliter l'emploi de la dll depuis un autre langage que le C++. Et j'utiliserais la convention stdcall pour la même raison (C'est le mécanisme utilisé par la couche win32 de windows).

J'éssairais plutôt comme ça dans mon .h :
#ifdef _DLL
#define DLL_FUNC __declspec(dllexport)
#else
#define DLL_FUNC __declspec(dllimport)
#endif
extern"C"DLL_FUNCunsigned int __stdcall init_com(char * const,unsigned int);

Avec _DLL définit dans la dll et pas dans l'exe.

Depends permet de déterminer ce qui est exporté par une dll.
Tu peux ainsi savoir si ta dll export les fonction correctement.
jeudi 9 avril 2009 à 12:06:39 | Re : Charger des fonctions depuis une dll

HeXa2

Je connaissais pas dependency walker, mais j'utilise dllexp qui me donne le nom des fonctions exportées et leur adresse. A priori, ma dll exporte bien ses symboles, le probleme c'est a l'usage.

Je ne connais pas grand chose aux conventions d'appels (c'est ma premiere dll et mon premier VRAI projet en c++)

je ne connais donc que ce que j'ai pu trouver sur des forums divers et variés.

est ce que si je retire les conventions d'appels de mes fonctions dans la dll, ca marchera mieux?
je met mes bouts de code pour la fonction init_com
Dans le headerdll:
uint init_com(char comporttoopen[], uint bauds);
Dans le testdll.cpp (la ou je veux creer une instance de mes fonctions)
#include "H2BUSDLL.h"
#pragma comment(lib,"H2BUSDLL.lib")
Dans le Form1.h (le header de la classe graphique avec le bouton qui est censé appeler la fonction)
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

             init_com("COM1", 4800);
             
         }
};
et j'obtient les 2 erreurs de au dessus.

Mais je ne vous pas trop ou je peux mettre le bout de code que tu m'as passé. Dans ce que j'ai fait, j'ai mis les fonctions a exporter dans un .def
dans le .def de ma dll:
; H2BUSDLL.def : déclare les paramètres de module pour la DLL.

LIBRARY      "H2BUSDLL"
EXPORTS
    init_com        @1
    write_data_s    @2
    write_data_m    @3
    read_data_s        @4
    read_data_m        @5
    end_com         @6

je suis "un petit peu" (euphemisme) perdu la..





1 2 3

Cette discussion est classée dans : dll, data, read, h2busdll, testh2bus


Répondre à ce message

Sujets en rapport avec ce message

Embarquer une dll dans un executable [ par MetalDwarf ] Voila je voudrais embarquer une dll dans un executable, c est a dire la mettre en data dans mon fichier source, et la reecrire sur le disque dur a l e Avis des PROS! [ par UnExPeCtEdSpy ] Bonjour,je suis plus familier du vb que du c++ alors j'vous d'mande de l'aide :J'utilise une Dll en c+ avec un prog en Vb qui manipule des fichiers.Qu E/S de dll [ par HeXa2 ] Bonjour à tous!Je suis en train de developper une dll en c++Mes fichiers sont H2BUSDLL.cpp et H2BUSDLL.hDans mon header, je déclare mes classes et dan probléme du linkage d'un une dll [ par nfousa ] bonsoir, Lorsque j'ai générer une A.dll à partir du mon code C qui utilise une B.dll j'ai obtenu EXPORTS .idata$4 @1 DATA . _Z7DllMainP1 Recherche d'adresse mémoire d'un DLL dans un processus [ par empathe ] Bonjour, je recherche une fonction pouvant me retourner l'adresse mémoire Hexa d'ou est stocké une DLL d'un processus. le code: [code=cpp] #include zlib1.dll introuvable pourtant pas utilisée ?! [ par supergrey ] Bonjour, je développe depuis quelques temps un jeu utilisant curl, directx, et newton, tout fonctionne très bien quand je lance mon programme à partir je cherche algorithme de data encryption standard DES qui traduit en c/c++ [ par jlassie17 ] svp qui me donne cette algorithme en c ou c++ Manipuler des caracteres un par un avec la fonction read... [ par ROW_PyRo ] Bonjour, Je suis actuellement sur un projet, BSQ. [quote] Il s'agit de trouver le plus grand carré possible sur un plateau en évitant des obstacles. probleme read jusque a un \n [ par skatouse ] Bonjours, j'aimerais savoir si il est possible darreter un read a un caratere defini. je mexpliaue, je veut ouvrir un fichier, puis en suite le le sto Simple Hook (DLL) qui plante GetMessage ! Je suis nul ou quoi ? [ par dam1dam1 ] Bonjour. Je ne suis pas un pro du Hook et j’ai un peu oublié tout ca, mais vu toutes les bonnes sources et annotations qui trônent ici, je pensais po


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales