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

Appel de DLL sans .DEF ou .LIB


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut Appel de DLL sans .DEF ou .LIB
    Bonjour,

    Venant de Blitz3D (Basic) et developant depuis peu sous DEVC++ et Code::block, mon problême est le suivant: Comment utiliser des DLLs Classiques ( Utilisable sous VB6 sans problême a l'aide d'une petite moulinette maison fabriquant un module de déclaration en .bas ) en C/C++ sans passer par les .DEF ou .LIB

    Sous Blitz3D, les DLLs sont interfacées a l'aide d'un fichier de définition comme celui-ci qui s'appelle par exemple "kernel.decls"
    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
     
     
    .lib "kernel32.dll"
     
    RtlMoveMemory_To%(Destination%,Source*,Length%) : "RtlMoveMemory"
    RtlMoveMemory_From%(Destination*,Source%,Length%) : "RtlMoveMemory" 
    RtlMoveMemory_Ex%(Destination%,Source%,Length%) : "RtlMoveMemory"
    Api_RtlCopyMemory(Destination,Source*,Length):"RtlMoveMemory" 
    Api_RtlMoveMemory(Destination*,Source,Length):"RtlMoveMemory" 
    Api_GlobalAlloc%(uFlags,dwBytes):"GlobalAlloc"
    Api_GlobalLock%(hMem):"GlobalLock"
    Api_GlobalUnlock%(hMem):"GlobalUnlock"
     
    ou
     
    ;--------------------------------------------------------------------------------------
    ;winmm.decls
    ;--------------------------------------------------------------------------------------
    .lib "winmm.dll" 
    ;
    winmm_mciSendString%(Command$,ReturnString*,ReturnLength%,Callback%):"mciSendStringA" 
    winmm_mciExecute%(Text$):"mciExecute" 
    winmm_mciGetErrorString%(Error%, Buffer*, Length%):"mciGetErrorStringA"
    ;--------------------------------------------------------------------------------------
    Mon but, faire la même chose pour le C/C++. Un espèce de "Kernel.H".

    Merci

    Jean-Pierre.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Sous Windows, les fonctions système (y compris celles du kernel) sont dans windows.h, et la bibliothèque qui va bien est liée par défaut sur la plupart des compilos.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Oui il suffit d'appeler MoveMemory comme le dit Laurent il ya déjà les .lib et .h correspondant.
    Voir le MSDN c'est la bible de la programmation Windows

  4. #4
    Membre actif
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Salut,

    J'ai pris comme exemple les APIs de windows. Ce n'était pas très judicieux car effectivement leurs appels ne pose aucun pb. Ils sont déjà déclarés dans les compilateurs et la présence des .LIB ou .A et .DEF facilitent leurs integrations.
    Ici un exemple concrêt. Je n'ai que la DLL et le fichier de déclaration suivant (extrait) :
    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
     
    .lib "Blitzpx.dll"
    pxBodyCreatePlane%(x#, y#, z#):"_pxBodyCreatePlane@12"
    pxBodyCreateCube%(dx#, dy#, dz#, mass#):"_pxBodyCreateCube@16"
    pxBodyCreateSphere%(radius#, mass#):"_pxBodyCreateSphere@8"
    pxBodyCreateCapsule%(height#, radius#, mass#):"_pxBodyCreateCapsule@12"
    pxBodyCreateCylinder%(radius#, height#, nbEdge%, mass#):"_pxBodyCreateCylinder@16"
    pxBodyCreateHull%(vbank*, nvert%,mass#):"_pxBodyCreateHull@12"
    pxBodyCreateHullFromSSM%(surf%, mass#):"_pxBodyCreateHullFromSSM@8"
     
    pxCreateTriMeshPmap%(vbank*, fbank*, MESH_NBVERTICES%, MESH_NBFACES%, file_name$, pMap%):"_pxCreateTriMeshPmap@24"
    pxCreateTriMeshFromPmap%(triangleMesh%, mass#):"_pxCreateTriMeshFromPmap@8"
    pxCreateTriMesh%(vbank*, fbank*, MESH_NBVERTICES%, MESH_NBFACES%, mass#):"_pxCreateTriMesh@20"
    pxCreateTerrain%(nSize%, bank*, scale_x#, scale_y#, scale_z#):"_pxCreateTerrain@20"
    pxCreateTerrainFromMesh%(vbank*, fbank*, MESH_NBVERTICES%, MESH_NBFACES%, axis#):"_pxCreateTerrainFromMesh@20"
    pxCreateTerrainPmap(vbank*, fbank*, MESH_NBVERTICES%, MESH_NBFACES%, axis#, file_name$, pMap%):"_pxCreateTerrainPmap@28"
    pxTestTriMesh%(entity%, mass#):"_pxTestTriMesh@8"
    pxCreateTriMeshToFile%(vbank*, fbank*, MESH_NBVERTICES%, MESH_NBFACES%, fname$):"_pxCreateTriMeshToFile@20"
    pxCreateTriMeshFromFile%(fname$, mass#):"_pxCreateTriMeshFromFile@8"
    Extrait du fichiers .dels de wrapper de Physx ( Ageia) a tranformer en "include_quelque_chose.h" afin d'exploiter cette DLL sous C/C++. Je sais convertir un .decls de Blitz3d vers un module.bas de VB6, mais je rame pour faire la même chose pour le C.

    Laissons Blitz3d de coté

    Comment faire un .H qui serait une conversion de ceci (déclaration de DLL sous VB6) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Declare Function AbortPath Lib "gdi32.dll" ( ByVal hdc As Long) As Long 
    Declare Function GetActiveWindow Lib "user32.dll" () As Long 
    Private Declare Function GetWindowDC Lib "user32.dll" (ByVal hwnd As Long) As Long
    Private Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" (ByVal hFindFile As Long, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
    Jpierre

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si c'est une bibliothèque destinée aux développeurs, il y a normalement les en-têtes C ou C++ qui vont avec. Sinon tu ne peux pas deviner les prototypes des fonctions.

    Ensuite pour charger la DLL explicitement ainsi que ses fonctions, je te laisse regarder la doc de LoadLibrary, GetProcAddress et FreeLibrary (sous Windows).

  6. #6
    Membre actif
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    "LoadLibrary, GetProcAddress et FreeLibrary"
    C'est en effet la solution

    Merci
    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
     
    HINSTANCE hDLL;               // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
    DWORD dwParam1;
    UINT  uParam2, uReturnVal;
     
    hDLL = LoadLibrary("MyDLL");
    if (hDLL != NULL)
    {
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");
       if (!lpfnDllFunc1)
       {
          // handle the error
          FreeLibrary(hDLL);       
          return SOME_ERROR_CODE;
       }
       else
       {
          // call the function
          uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
       }
    }

    Edit : Un jour je serai une bêêêêteeeee en C/C++

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

Discussions similaires

  1. Utiliser une DLL sans le .LIB dans Visual Studio 2005
    Par lekernel dans le forum Visual C++
    Réponses: 5
    Dernier message: 02/08/2007, 08h54
  2. Probleme d'appel d'une dll, sans lib et sans stdcall
    Par tchern dans le forum Visual C++
    Réponses: 8
    Dernier message: 31/07/2007, 16h37
  3. DLL sans .DEF ou .LIB
    Par ZJP972 dans le forum C
    Réponses: 3
    Dernier message: 05/07/2007, 21h40
  4. Utiliser un DLL sans .LIb et sans .DEF
    Par ZJP972 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 05/07/2007, 21h39
  5. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22

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