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

Windows Discussion :

[C] Exécution dynamique DLL


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut [C] Exécution dynamique DLL
    Bonjour,


    Je cherche un moyen d’exécuter dynamiquement une fonction provenant d’une DLL.
    En effet, j’ai développé une application dans laquelle un popup demande de sélectionner une DLL et de la charger (jusqu’ici pas de pb), il faut ensuite entrer le prototype de la fonction sauf qu’après je ne sait pas comment exécuter cette fonction sans passer par la case compilation. Existe il des solutions en C (peut-être API windows) pour pousser les paramètres sur la pile ?


    Merci de votre aide

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Si tu saisies le prototype, ça sera sous forme chaine de caractères, mais on ne peut pas transformer une chaine en fonction directement, tu es obligé de traiter chaque cas avec un strncmp par exemple, ça implique qu'il faut que tu es une "table de mapping" qui mette en relation une chaine avec une fonction. Autrement ça peut se faire en assembleur mais j'ignore si le système l'autorise.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    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 399
    Par défaut
    Empiler dynamiquement les paramètres est impossible directement en C.

    Mais tu dois pouvoir tricher avec une fonction Win32 utilisée pour les composants COM : DispInvoke(). Par contre, ça ne marchera pas pour tout.
    Procédure:
    1. Fabriquer de toutes pièces une structure INTERFACEDATA avec les informations sur la fonction (type de retour, etc). Tu risques d'avoir une contrainte: Il est possible que le premier paramètre doive absolument être un pointeur (à cause de this).
    2. Utiliser la fonction CreateDispTypeInfo() avec cette INTERFACEDATA
    3. Créer une fausse vtable : Juste une structure contenant un pointeur de fonction
    4. Assembler les paramètres sous forme de structure DISPPARAMS
    5. Appeler DispInvoke().

    Edit: Ça ne marchera pas, il y a un problème: Tu ne pourras pas spécifier le premier paramètre en fait. Dommage...
    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
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Décidément, tu m'étonneras toujours Médinoc...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    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 399
    Par défaut
    Mais là, je me suis sûrement trompé: DispInvoke() semble trop spécialisée vers les composants COM (ou toute classe C++ en fait) pour pouvoir l'utiliser sur autre chose...

    Donc, la meilleure solution semble être de faire un bout de code en assembleur...
    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
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut
    Salut,

    Je vais me plonger dans le code assembleur.

    Merci de vos réponses.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    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 399
    Par défaut
    J'ai du nouveau!

    Je me suis dit "comment appeler dynamiquement une fonction en utilisant le moins de code assembleur possible" ?
    Et j'ai trouvé une piste!
    Ce n'est pas encore testé, mais je pense pouvoir véritablement tricher avec DispInvoke() : Il suffit pour cela de faire des fonctions en assembleur, dont les premiers paramètres sont compatibles avec DispInvoke(), mais qui suppriment ces paramètres de la pile et appellent les fonctions associées.

    Je viens d'écrire les fonctions, et c'est vrai que ça tient dans très peu d'assembleur (mais la version __cdecl est forcée d'utiliser une variable globale (ou du thread-local storage) pour sauvegarder un registre qui ne peut être sauvé sur la pile).
    Je teste avec DispInvoke() et je te tiens au courant...

    Edit: Oh put1 ÇA MARCHE!
    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.

Discussions similaires

  1. Packages d'exécution (dynamique)
    Par rvzip64 dans le forum Langage
    Réponses: 7
    Dernier message: 10/07/2007, 21h00
  2. Librairie dynamique (DLL) en Borland
    Par ywan42 dans le forum Windows
    Réponses: 3
    Dernier message: 18/03/2007, 19h19
  3. Erreur d'exécution: msvcr80d.dll
    Par mister3957 dans le forum MFC
    Réponses: 6
    Dernier message: 25/01/2007, 17h48
  4. Comment exécuter une DLL ?
    Par chleuh dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 15h27
  5. Recompiler une librairie dynamique (DLL) en statique
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 07/04/2005, 20h28

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