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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 395
    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 395
    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

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