Comment utiliser les fonctions d'une dll

kollibar Messages postés 45 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 31 janvier 2006 - 9 déc. 2005 à 18:31
kok_ofgod Messages postés 3 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 26 avril 2007 - 26 avril 2007 à 11:09
bonjour

je veux utiliser les fonctiopns d'une dll de façon dynamique que j'ai créer, je me suis inspiré d'autres source mais je ne comprend pas pourquoi ca ne marche pas!
J'arrive a charger la dll mais pas a appeller une de ces fonctions!

est ce que quelqu'un pourrait me dire exactement comment ca fonctionne...
qu'eqst ce qu'il faut faire dans la dll, comment il faut déclarer les fonctions et comment on appelle les fonctions depuis l'exe.

merci

10 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 18:46
Certaines fonctions sont décorées (contiennent par exemple @4 à la fin).
Avec ce prog, tu saura quel est le nom exact de chaque fonction exportée, et tu pourra la récupérer avec GetProcAddress
http://www.cppfrance.com/code.aspx?ID=25603

Bien sur, il faut déclarer les fonctions en __declspec(dllexport)
Par exemple, tu peux regarder cette source
http://www.cppfrance.com/code.aspx?ID=24723
0
kollibar Messages postés 45 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 31 janvier 2006
9 déc. 2005 à 19:47
effectivement je n'y arrivais pas juste parce que le nom de la fonction était transformé @0 a la fin!

y a pas un moyen de forcer à garder le meme nom???
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 20:16
Les fonctions __stdcall sont décorée _nom@XX
Les fonctions __cdecl sont décorées _nom
Les fonctions __fastcall sont décorées nom@XX

Ou XX est la somme des tailles en octets des paramètres

Il doit quand même y avoir moyen que les noms ne soient pas décorés, par exemple celles de shell32.dll ne le sont pas.
J'ai essayé avec VC++ 2005, et une fonction f est décorée en ?f@@YGXH@Z, donc c'est plutot inquiétant.
Tu devrais choisir l'autre solution, qui consiste à créer un fichier lib que tu utilisera dans ton projet utilisant la DLL

Du coup, plus besoin de charger la DLL explicitement, et plus de GetProcAddress
Exemple:
http://www.cppfrance.com/code.aspx?ID=25998
0
kollibar Messages postés 45 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 31 janvier 2006
9 déc. 2005 à 20:37
merci!!

et une autre question vite fait... une dll n'a pas le droit de créer des thread???
j utilise dev-c++ et il me dit permission denied qd je veux créer un thread aevc une dll!! mais il le met de manière aléatoir(j'ai pu la compiler mais pâs a achaque fois.. alors que je n'avais que changé les noms des fonctions)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 20:50
Je n'ai pas eu de problème pour créer un thread dans une DLL. C'est CreateThread qui échoue?
0
kollibar Messages postés 45 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 31 janvier 2006
9 déc. 2005 à 21:00
je comprend pas... maintenant ca compile correctement je n'ai pourtant rien changé!!(sauf le nom )

par rapport au nom j avais pas fait gaffe, il rajout _Z7 devant et v@0 derrière.
pour le @0 je saius ce que c'est maintenant mais le _Z7 et le v?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 21:10
Je n'en sais rien. Si tu ne veux pas vérifier à chaque foiss, tu fais la méthode avec la lib, c'est plus simple
0
kok_ofgod Messages postés 3 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 26 avril 2007
24 avril 2007 à 10:34
Bonjour!
je travaille sur un projet bluetooth intégrant la nouvelle console de nintendo la Wii.

j'aimerai automatiser la première étape sui consiste à :
1/- lancer bluesoleil
2/- Rechercher les prériphériques Bluetooth (pour le moent la Wii)
3/- Activer les services ( actuellement le profil HID)
4/- Choisir un service puis se connecter avant de l'utiliser. (etant le seul connexion au profil)

j'ai télécharger l'Api bluesoleil à cette adresse
http://www.bluesoleil.com/download/index.asp
elle a été developpée avec visual studio 6.0 et moi j'utilise visual studio 2005.
Dans la documentation il conseille de cahrager les fonction en faisant recours non pas au fichiers d'entet et à la lib mais plutot d'utiliser la dll (btfunc.dll) installé dans le reperoire systeme "System32" de windows par bluesoleil.

Ne sachant pas comment fonctionne loadLibrary(), je suis me suis rendu sur le site de microsoft msdn et j'ai récupéré l'aide qui se trouve à cette adresse
http://msdn2.microsoft.com/en-us/library/ms686944.aspx
J'ai remplacé  "myPuts" de  l'exemple par ma dll c'est à dire  "btfunc.dll"
à l'exécution "GetProcAddress" echoue a chaque fois.

en lisant ce qui est cidessus, j'ai pu me rendre à cette adresse
http://www.cppfrance.com/code.aspx?ID=25603
le fichier ImportExport.exe affiche bien le contenu de la dll.
en me montrant les dépendance (les autres dll appelées)

moi je ne réussi pas à appeller la fonction "BT_GetVersion" comme dit dans la doc
0
kok_ofgod Messages postés 3 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 26 avril 2007
24 avril 2007 à 10:42
je n'arrive pas coller l'image du résultat de importExport sur mon pc

bon je vais donc saisir ce que j'ai
   
       001   0x00001d40   BT_CheckFeature
       002   0x000015d0   BT_BrowseServices
       .....
       016   0x00001cb0   BT_GetVersion

et voici mon code

// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
 
#include <stdio.h>
#include <windows.h>
 
typedef int (*MYPROC)(LPTSTR);

 
VOID main(VOID)
{
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
 
    // Get a handle to the DLL module.
    printf("call of load lib. \n");
    hinstLib = LoadLibrary(TEXT("btfunc.dll"));
   
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL)
    {
        printf("call succed LoadLibrary...\n");
        printf("call GetProcAddress \n\n");
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, (LPCSTR)TEXT("BT_GetVersion"));
 
        // If the function address is valid, call the function.
 
        if (NULL != ProcAdd)
        {
            printf("call succed GetProcAddress...\n");
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (TEXT("Message via DLL function\n"));
            //(int) (TEXT("Message via DLL function\n"));
        }
 
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib);
    }
 
    // If unable to call the DLL function, use an alternative.
 
    if (! fRunTimeLinkSuccess)
        printf("Unable to get DLL function adress \n\n so Message via alternative method\n");
}

J'ai jamais réussi à m'inscire sur le forum de bluesoleil. a chaque fois j'ai un pb avec leur serveur ou alors le login est déjà utiliser.

merci pour l'aide
0
kok_ofgod Messages postés 3 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 26 avril 2007
26 avril 2007 à 11:09
Enfin j'ai la solution
je suis trop content

// test_loadlib.cpp : définit le point d'entrée pour l'application
console
 

#include"stdafx.h"

 

#include<stdio.h>

#include<windows.h>

int CallMyDLL(void)

{

   /* get handle to dll */

   HINSTANCE
hGetProcIDDLL = LoadLibrary(L"btfunc.dll");

 

   /* get pointer to the function in the dll*/

   FARPROC
lpfnGetProcessID = GetProcAddress(HMODULE

  
(hGetProcIDDLL), "BT_GetVersion");

 

   /*

   
Define the Function in the DLL for reuse. This is just prototyping

   
the dll's function. A mock of it. Use "stdcall" for maximum

   
compatibility.

  
*/

  

   typedef DWORD
(__stdcall * pICFUNC)(void);

 

   pICFUNC
BT_GetVersion;

   BT_GetVersion
= pICFUNC(lpfnGetProcessID);

 

   /* The actual call to the function contained in the dll */

   DWORD
intMyReturnVal = BT_GetVersion();

  

   printf("API Version 
%d.%d", LOBYTE(LOWORD(intMyReturnVal)), HIBYTE(LOWORD(intMyReturnVal)));

  

/* Release the Dll */

  
FreeLibrary(hGetProcIDDLL);

 

   /* The return val from the dll */

   return intMyReturnVal;

}

VOID main(VOID)

{

      int k;

      CallMyDLL();

      scanf("%d",&k);

 

}



Un grand merci à  

http://www.goffconcepts.com/techarticles/development/cpp/calldll.html
0
Rejoignez-nous