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 :

[débutant] DLL écrite en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut [débutant] DLL écrite en C
    Bonjour,
    j'ai écris une DLL en C, et j'aimerais que celle-ci me retourne une chaîne de caractère.
    Ma DLL peut me renvoyer un long, un float etc mais je ne sais pas comment lui faire renvoyer une chaîne ...
    Voici un extrait de la DLL, avec en entrée une chaîne et en sortie un long :

    madll.h contient ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export long __stdcall TestFonction(char *chaine);
    madll.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "madll.h"
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    long coderetour;
     
    long __stdcall TestFonction(char *chaine)
    {
    ...
    return (coderetour)
    }
    Mais je ne sais pas comment mettre une chaîne en retour ...

    Toute aide sera grandement appréciée !

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu peux retourner une adresse obtenue avec un malloc.
    Attention tout de même, sous Windows, il serait peut-être préférable d'utiliser les fonctions Windows d'allocation mémoire, GlobalAlloc ou autres je ne sais plus très bien.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Sous Windows, avec des fonctions comme malloc() ou l'opérateur C++ new, il y a une contrainte telle qu'une zone mémoire allouée par un malloc() dans un module doit être libérée par un free() dans le même module. Pour cela, tu peux par exemple exporter une fonction pour allouer la chaîne et une fonction pour la détruire.

    Ou bien, tu peux utiliser les fonctions d'allocation Win32:
    • Famille LocalAlloc() (plus ou moins deprecated)
    • Famille GlobalAlloc() (plus ou moins deprecated aussi, mais utilisée pour le DDE)
    • Famille VirtualAlloc() (conseillée pour de grosses zones mémoire, de l'ordre de plusieurs "pages")
    • Famille HeapAlloc() (que je conseillerais pour des petites zones mémoire comme de simples chaînes).


    PS: Tu peux aussi retourner un pointeur vers une chaine littérale statique, que la fonction soit dans une DLL ou non...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Dans le cas du buffer static, attention à la réentrance...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    En effet, comme partout dès qu'il est question de données static ou de variables globales.
    Mais pour une chaîne littérale statique, il n'y a pas de soucis à avoir...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Je n'avais pas compris le sens de chaîne littérale statique, tu parles d'une chaîne en dur style "ma chaine statique écrite en dur", c'est ça ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est ça.
    "Chaîne littérale" == "Constante chaîne".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Bonjour,
    d'abord merci de vos réponses,
    ce site est très réactif !

    J'aimerais préciser que l'application qui utilisera cette dll aimerait avoir un
    "string" comme réponse ; je pense que ça va poser problème de lui retourner une adresse ou un pointeur
    (en fait j'ai déjà fait le test avec un pointeur, et ça plante grave).
    L'application est écrite avec un langage propriétaire, je n'ai pas beaucoup de marge de maneuvre

    Merci

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Eh bien, ça dépend... Tant qu'on ne sait pas sous quelle forme l'application appelante en langage spécial accepte des données, on ne peut pas trop t'aider...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Bonjour,

    c'est clair que sans être devant l'appli en question ce n'est pas facile !

    L'appli appelante utilise une sorte de Java propriétaire :

    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
    static void MaDLL(Args _args)
     {
         DLL DLL = new DLL("D:\\Projets\\Madll\\MaDLL.dll");
     
         DLLFunction fndll = new DLLFunction(DLL, "TestDLLl");
     
         str paramTest ; // str : type String
     
     
    paramTest = "Recherche test" ;
     
    // passage de paramètre 
           fndll.arg(ExtTypes::String);
    // donnée en retour
           fndll.returns(ExtTypes::String);
     
    //appel de la fonction et print affiche le résultat sur une console 
           print fndll.call(paramTest);
     
     }

    En retour je peux aussi recevoir du long, real, etc ... ça ça marche bien !

    A titre d'info, comment retourner un pointeur dans ma dll ?
    Est-ce par un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export char* __stdcall TestFonction(char *chaine);
    (dans le .h)

    et dans la fonction c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char* __stdcall TestFonction(char *chaine)
    {
    ...
    return (&chaineretour)
    }

    Merci encore !

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut

    Eh bien, la déclaration a l'air OK, mais pour le retour, il faut savoir ce qu'est chaineretour: Ça ne doit PAS être une variable locale.

    PS: Il n'y a pas de doc sur l'intefaçage de ton langage bizarre?
    PPS: Tu connais le nom de ce langage?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DLL DLL = new DLL("D:\\Projets\\Madll\\MaDLL.dll");
    Essaie de dissocier les 2 noms (variables et nom de class....) car la

Discussions similaires

  1. Dll écrite en C++ et importée sous VB6.
    Par Doomdoom dans le forum C++
    Réponses: 3
    Dernier message: 21/02/2007, 13h50
  2. Importer une lib/DLL écrite en borland en C++
    Par dandan80 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 04/10/2006, 12h02
  3. Réponses: 1
    Dernier message: 10/05/2006, 19h45
  4. Réponses: 6
    Dernier message: 21/06/2005, 21h45
  5. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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