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

dllimport mode d'emploi?


Sujet :

C++Builder

Vue hybride

JeanNoel53 dllimport mode d'emploi? 02/01/2011, 19h08
ShaiLeTroll Regarde plutôt un système de... 03/01/2011, 10h44
JeanNoel53 Bonjour 03/01/2011, 11h47
Patrick Seuret Le dllexport sert seulement... 03/01/2011, 13h22
JeanNoel53 Avancons ensemble 03/01/2011, 18h00
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut dllimport mode d'emploi?
    Bonjour

    Je n'arrive pas à déclarer correctement une fonction du programme principal appelé dans une Dll
    La fonction appelée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    __declspec (dllexport) std::wstring GetDirectory( std::wstring NameOfWord)
    {
       if( wcscmp( NameOfWord.c_str(), L"wsWorkDirectory") == 0)
          return( wsWorkDirectory);
       else
          return(0);
    }
    Je ne crois pas pertinent de déclarer une fonction de l'exécutable principal comme dllexport, mais j'ai essayé. Ça ne produit pas de librairie comme dans une Dll
    la déclaration de la fonction dans l'appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __declspec(dllimport) std::wstring GetDirectory( std::wstring NameOfWord);
    l'appel de la fonction dans la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wsWorkDirectory = GetDirectory(  L"wsWorkDirectory");
    si je ne met pas de déclaration j'ai un message appel d'une fonction non déclarée et si je la met j'ai un unresolved external.
    comment déclarer une fonction dans une DLL qui soit fourni par l'exécutable principal.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 074
    Par défaut
    Regarde plutôt un système de CallBack pour fournir le pointeur (ou une table de pointeur) des fonctions que tu souhaites voir "exporter" par le programme

    Voir aussi aussi les ActiveX et RegisterActiveObject\GetActiveObject
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Bonjour
    Bonjour,
    J'ai doc codé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    callback std::wstring GetDirectory( std::wstring NameOfWord);
    mais le compilateur me répond erreur de syntaxe de la déclaration
    à+

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Le dllexport sert seulement lorsque tu crées une DLL pour dire quelles fonctions sont visibles de l'extérieur (le programme principal). Je ne connais malheureusement pas très bien l'usage de dllimport et je les utilise toujours ensemble (mais seulement au niveau de la DDL: __declspec(dllexport,dllimport)). Alors peut-être que je me trompe mais si ta fonction GetDirectory() est dans le programme principal et doit être appelé DEPUIS la DLL, alors tu n'as rien de spécial a déclarer. Il faut toutefois que tu transmette l'adresse de la fonction à la DLL à un moment ou un autre. C'est ça le système de callback.

    Pour cela il faut que la fonction de la DLL connaisse la signature de la fonction de callback qu'elle doit appeler. Voici un exemple:

    Dans la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Déclaration de la signature attendue par la fonction
    typedef std::wstring (*MyCallbackFunctionType)(std::wstring);
     
    // Déclaratin de la fonction appelée depuis le programme principal
    extern "C" __stdcall __declspec(dllexport,dllimport) MyDLLFunction(MyCallbackFunctionType myFunction) {
     
      if (myFunction!=NULL) {
        std::wstring result=myFunction(L"wsWorkDirectory");
      }
     
    }
    Dans ton programme principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Déclaration de la fonction de callback (en fait une fonction "normale")
    std::wstring GetDirectory( std::wstring NameOfWord)
    {
    ...
    }
     
    // Appel de la DLL en lui transmettant la fonction avec la bonne signature
    MyDLLFunction(&GetDirectory);

  5. #5
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Avancons ensemble
    Bonjour,
    Votre explication m'a beaucoup servi
    cependant je n'arrive pas encore au résultat
    voila ce que j'ai fait à partir de vos explications
    Dans la Dll la déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef std::wstring (*MyCallbackFunctionType)(std::wstring);
    std::wstring result;
    // Déclaratin de la fonction appelée depuis le programme principal
    extern  __stdcall __declspec(dllexport,dllimport) MyGetDirectory(MyCallbackFunctionType GetDirectory)
    {
      if ( GetDirectory!= NULL)
      {
        result = GetDirectory(L"wsWorkDirectory");
      }
    }
    ensuite l'appel dans le corps du programme
    J'ai d'abord testé la variable result qui est nulle
    puis j'ai codé comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyGetDirectory(&GetDirectory);
    wsWorkDirectory = result;
    et là le compilateur me répond : symbol GetDirectory non défini
    La fonction dans le programme appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::wstring GetDirectory( std::wstring NameOfWord)
    {
       if( wcscmp( NameOfWord.c_str(), L"wsWorkDirectory") == 0)
          return( wsWorkDirectory);
       else
          return(0);
    }
    qui ne pose problème ni à la compilation, ni a l'exécution
    Je prends le parallèle avec votre exemple et je ne vois pas ou je me suis trompé?
    à+

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Bonjour,

    Vous dites:
    Citation Envoyé par JeanNoel53 Voir le message
    ensuite l'appel dans le corps du programme
    J'ai d'abord testé la variable result qui est nulle
    C'est bizarre car votre variable "result" est en fait déclarée dans la DLL et ne devrait donc pas être accessible par le corps du programme... alors que GetDirectory() devrait être dans le corps du programme est donc accessible.

    Comme tout est inversé, pourriez-vous me donner les noms de fichiers correspondant à chaque code que vous avez posté?

    Je suis parti du principe que la fonction "GetDirectory()" se trouve dans le corps du programme et la fonction "MyDLLFunction" est dans la DLL. Par ailleurs, je constate que j'ai oublié de retourner le résultat depuis "MyDLLFunction":

    Dans la DLL:
    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
     
    // Déclaration de la signature attendue par la fonction
    typedef std::wstring (*MyCallbackFunctionType)(std::wstring);
     
    // Déclaratin de la fonction appelée depuis le programme principal
    extern "C" __stdcall __declspec(dllexport,dllimport) MyDLLFunction(MyCallbackFunctionType myFunction) {
     
      static std::wstring result;
     
      result=L"";
      if (myFunction!=NULL) {
        result=myFunction(L"wsWorkDirectory");
      }
     
      return result;
     
    }
    Et le programme principal devrait retrouver le texte (j'ai mis "result" en statique pour s'assurer que l'espace mémoire de la variable n'est pas détruit au moment du retour (il faut faire bien attention à faire une COPIE de son contenu dans le programme principal car elle peut être modifiée par un nouvel appel à MyDLLFunction)

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

Discussions similaires

  1. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  2. [débutante][Concept] Destruction d'objet, mode d'emploi?
    Par skea dans le forum Général Java
    Réponses: 4
    Dernier message: 12/06/2004, 21h48

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