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 :

comment utiliser une DLL win32 en C??


Sujet :

C

  1. #1
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut comment utiliser une DLL win32 en C??
    bonjour...

    Je dispose d'une DLL win32 écrite en Pascal. Je souhaite utiliser cette DLL dans un programme C. Après avoir chargé ma DLL, j'arrive de manière dynamique à utiliser quelques fonctions de la DLL mais pas toutes. En effet certaine d'entre elles ont un prototype particulier et me renvoie des paramètres incompatible avec le C.

    J'ai par exemple la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //définition du prototype de la fonction
      typedef (*FCTX1) (char *monNom);
     
    // Déclaration du pointeur
      FCTX1 Ptr1;
     
    //chargement de la fonction "fonctionIdentification"
      Ptr1 = (FCTX1)GetProcAddress(ModId, "fonctionIdentification") //ModId contient l'adresse de la DLL
     
    //utilisation de la fonction "fonctionIdentification"
      Ptr1 ("jayceBlaster");
    Pour ce type de fonction je n'ai aucun problème mais la ou ca coince c lorsque j'ai des fonction qui n'attendent aucun paramètre d'entrée et me renvoie un string qui est un type nom reconnu en C.

    je n'arrive meme pas a définir le prototype de ma fonction dans le C. Je serai tenté d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //définition du prototype de la fonction
      typedef string (*FCTX2) ();
     
    // Déclaration du pointeur
      FCTX2 Ptr2;
     
    //chargement de la fonction "heure"
      Ptr2 = (FCTX2)GetProcAddress(ModId, "heure") //ModId contient l'adresse de la DLL
     
    //utilisation de la fonction "heure"
      maChaine=Ptr2 (); // maChaine== string
    Mais ceci ne marche pas bien entendu d'une part car le type string est inconnu en C et d'autre par car le compilateur n'accepte pas la définition de cette fonction qui n'attend aucun paramètre d'entrée..

    J'espere que je suis claire dans mes explications et que quelqu'un pourra me venir en aide??

    merci...

  2. #2
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Bonjour

    J'ai toujours un peu de mal avec les code incomplet, mais je vais essayer.
    Quand tu déclaire typedef string (*FCTX2) (), tu ne donne pas de signature pour les paramètres. Et dans ce cas là, le C ne dit pas qu'il n'y a pas de paramètres! Il suppose qu'il y a un paramètre implicite de type int! Il faut que tu déclare typedef string (*FCTX2) (void). Le void doit être explicit. Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void ma_procedure () {
    ...
    }
    c'est exactement comme si tu écrivais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void ma_procedure (int quelque_chose) 
    {
    ...
    }
    il faut donc écrire en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void ma_procedure (void)
    {
    ...
    }
    C'est une bizzarerie du C... il n'a que ça d'ailleur. Et si tu programmais en Pascal avant, je te promet qu'avec le temps, le C va peut-être te dégouter, et que tu va regreter Pascal, qui est un des meilleur langage jamais inventé. J'ai longtemps programmé en Pascal, ça allait tout bien. Puis je suis passé au C contraint et forcé (sans jeux de mot), parce qu'on ne voit que lui partout. Avec le temps, il s'avère que les projets en C sont ingérables (ou le sont laborieusement). J'ai donc décidé de passer à Ada depuis quelques semaines.... et je me sent libéré

    Excuse moi pour le baratin... je poursuit avec ta question.

    J'aimerais voir ta définition du type string aussi en fait. Mais normalement ça ne devrait pas poser de problème, parce que les convention d'interface avec les DLL font que le type renvoyé n'a aucun incidence sur le symbole à importé (contrairement aux paramètres, dont la taille totale en byte apparait souvent dans le symbole).

    Mais je me dis que cela dépend aussi du compilateur Pascal que tu utilisait pour créer la DLL, car peut-être qu'en fait il renvoie les chaîne en renvoyant un pointeur sur un String. Ca dépend aussi si la fonction de la DLL renvoie un type String ouvert ou contraint (en Pascal, c'est comme en Ada, une chaîne peut être ouverte ou contrainte, tout comme les tableaux). Sans compter que certaines implémentations passe par les registres pour renvoyer les structure (avec les registres bx et cx, sur les ancien compilateur 16 bits).

    Sinon, pour en revenir à la signature, si tu as utilisé un fichier definition (me_dll.def) pour créer la librairie d'importation (ma_dll.lib), alors essaie de modifier le fichier def pour qu'il y ai FCTX2@0 (attaché!), signifiant explicitement que FCTX2 prends 0 octets en paramètre (et peu renvoyer n'importe quoi, puisqu'on ne peut pas le spécifier explictement).

    Voilà

    I hope it's easy enought to understand...

    Si tu me trouve trop compliqué, dit moi, j'essaierai de faire des efforts la prochaine fois

    Bonne nuit

  3. #3
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    SALUT HIBOU57


    Tres sympa d'avoir pris du temps a m'expliquer

    Je sais pas si je l'ai précisé mais je ne suis pas une star en programmation...

    Alors en ce qui concerne le type renvoyé c vrai qu'il n'y a rien compliqué et pour avoir deja créé quelque fonction en C j'aurai pu, et j'aurai du meme, le savoir.

    Par contre pour le type renvoyé alors la j'ai plongé.. Si ca peut t'aider ma DLL a était crée sous delphi 2005 et je serais pas capable de te dire si ma DLL renvoie un string "ouvert" ou "contraint" (c'est moi qui l'ai écrite et je sais meme pas ). voila comment elle est déclaré:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     function Heure (): string; stdcall;
    begin
      TForm1.Heure();   //appel la fiche associé à ma dll (car composant graphique)
    end;
    Voila je sais plus quoi préciser

    Ah si!!! J'ai d'autre fonction quiattende des string enfin des pchar en entrée et ca marche trs bien mais je sais pas pour le paramètre de retour je galere...


  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Hibou57
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void ma_procedure () {
    ...
    }
    c'est exactement comme si tu écrivais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void ma_procedure (int quelque_chose) 
    {
    ...
    }
    Tu racontes n'importe quoi.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: comment utiliser une DLL win32 en C??
    Citation Envoyé par Jayceblaster
    Je dispose d'une DLL win32 écrite en Pascal. <...>
    Il existe un forum "Développement Windows".

  6. #6
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    JayceBlaster, la réalité étant souvent plus vraie que les mots (car on peut omettre des détails ou ne pas les avoir perçu), je te propose, si tu veux bien, de m'envoyer la dll par mail (zipée, pour qu'elle passe bien). J'essaierai de la lier, et si j'y arrive, je décrit la solution ici.

    Juste une question : quel est ton compilateur ? gcc ou compatible microsoft ? Si tu ne sait pas, essaie d'écrire ceci juste avant n'importe quelle déclaration de procedure/fonction : __attribute__((stdcall)) si le compilateur ,ne comprends pas, c'est un compatible microsoft, sinon, c'est gcc.

    si tu es d'accord pour m'envoyer la dll (je ne vais pas la distribuer ni la pirater, rassure toi), alors dis moi, et je te transmet une adresse e-mail en message privé.

    @+

  7. #7
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    ok pas de soucis je t'enverrai ma dll

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Hibou57
    je te propose, si tu veux bien, de m'envoyer la dll par mail (zipée, pour qu'elle passe bien).
    Ou comment un Hibou va se choper un bon vieux H5N1...

  9. #9
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Bonjour Jayceblaster,

    Est-ce que tu as trouvé une solution finalement ? Est-ce que c'est toujours d'actualité ?

Discussions similaires

  1. [C] Comment utiliser une DLL ?
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 1
    Dernier message: 14/05/2006, 12h26
  2. [COM] Comment utiliser une dll DotNet dans un projet win32 ?
    Par Marmottoc dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 05/05/2006, 15h58
  3. [Langage]Comment utiliser une dll .NET dans VB6?
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/04/2006, 14h20
  4. Comment créer une dll Win32 sous Delphi ?
    Par Mickey.jet dans le forum Langage
    Réponses: 8
    Dernier message: 16/06/2005, 15h38

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