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

VC++ .NET Discussion :

Appel Pascal Delphi en C++


Sujet :

VC++ .NET

  1. #1
    Membre expérimenté

    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 51
    Par défaut Appel Pascal Delphi en C++
    Bjr,

    qqun pourrait-il m'expliquer comment appeler une fonction Pascal developpee avec Delphi a partir d'un pgm Visual C++ ?

    Merci d'avance
    jimif@free.fr

  2. #2
    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
    Je dirais comme n'importe quelle autre fonction contenue dans une DLL: Utiliser P/Invoke, comme en C#.
    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.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Delphi .NET ?

    Sinon il faudrait trouver les outils Delphi pour générer des ;h et des .lib.

    Sinon utiliser "LoadLibrary" et "GetProcAddress" et c'est le début des galères.

  4. #4
    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
    Ah oui jimif57, j'ai supposé que tu programmais en .Net (C++/CLI ou Managed C++) et non en natif, parce que tu as posté ici. Si ce n'est pas le cas, de simples LoadLibrary()+GetProcAddress() devront faire l'affaire...
    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.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 51
    Par défaut Encore une question
    Merci de vos reponses, j'ai trouve LoadLibrary et GetProcAdress dans la doc, mais pas encore testé.
    Et pour passer des parametres, je fais comment ?
    Puis je sinon utiliser des variables globales visibles depuis le Pascal ?

  6. #6
    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
    J'ignore si on peut utiliser des variables globales avec GetProcAddress(). La méthode conseillée, c'est de faire un getter et un setter.

    Pour les paramètres, il te faut un pointeur de fonction du bon type. Typiquement, pour une fonction qui ajoute deux ints:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef int (__stdcall * ADDPROC)(int, int);
     
    ...
     
    HMODULE hMod = LoadLibrary( ... )
    ADDPROC addProc = reinterpret_cast<ADDPROC>(GetProcAddress(hMod, "Add"));
    int resultat = addProc(2, 2);
    (sans compter la gestion d'erreurs, bien sûr).
    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.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Médinoc, le problème n'est pas en quoi jimif57 développe mais en quoi est développée la fonction appelé.
    De plus, les conventions d'appel de la fonction Pascal ne sont pas forcément celles des API Win32 implémentées en C avec convention stdcall.
    J'ai bien dit que s'était le début des emmerdes, non ?
    On est en C++, on a les coudés franches pour faire notre tambouille pour les conventions d'appel mais comme dirait une araignée : "un grand pouvoir entraine une grande responsabilité".
    Donc, il faut prendre la peine de regarder s'il existe dans l'environnement Pascal s'il y a de quoi générer des .h et des .lib.

    Si on ne dispose pas de ces outils, il faudra voir avec "Depends" comment est exportée la fonction Pascal. Son nom d'exportation peux indiquer ces conventions d'appel s'il respecte les usages de Microsoft (qui ne sont pas des normes).

  8. #8
    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
    Le raccourci que tu sembles me reprocher d'avoir pris, c'est que la convention d'appel recommandée pour les DLLs (__stdcall) est justement la convention d'appel pascal... Il y a encode des #define PASCAL __stdcall dans les headers Windows...

    Quand aux informations de convention d'appel dans le nom, en fait, Microsoft recommande de ne pas les mettre dans les DLLs. Mais comme un programmeur C ou C++ doit connaître le format (relativement simple) des fichiers .def pour faire ça, beaucoup de gens se contentent d'un __declspec(dllexport) et c'est le nom C (voire pire, C++) décoré qui est exporté...
    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.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    "c'est que la convention d'appel recommandée pour les DLLs (__stdcall) est justement la convention d'appel pascal"
    Oui pour la gestion de la mémoire (qui désalloue la pile), et non pour l'ordre de l'empilement des paramètres dans la pile.
    C'est le bordel, c'est pas de ma faute.

    En plus je ne sais pas comment Delphi exporte les fonctions Pascal (vu que c'est du Delphi) et "Depends" permettra d'avoir des informations sur le type d'exportation donc sur les conventions d'appel.
    Mais je souligne la nécessité de rechercher les outils adhoc Delphi avant d'entrer dans cette galère.

    J'ai pas compris le dernier paragraphe de la réponse de Médinoc.
    Il ne faut pas d'informations de convention d'appel dans l'exportation des fonctions mais il faut connaître le format .def ? Def c'est pour le linker C/C++, il spécifie les conventions et on a un "problème" avec une fonction Delphi/Pascal, il est où le lien.
    __declspec(dllexport) fait autant qu'un .def mais en beaucoup plus simple à utiliser. S'il est mal utilisé, ce n'est pas de sa faute mais ses utilisateurs, qui, de toute façon auraient merdés le fichier .def.

    En fin de compte, la fonction est-elle exporté dans une dll?
    "Depend" donne quoi comme nom à la fonction après exportation dans une dll ?

  10. #10
    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
    Pour le dernier paragraphe, je parlais des développements en C ou C++ (pour simplifier, on va dire en C).

    Si l'on utilise bètement __declspec(dllexport) dans un développement C, la DLL exportera la fonction sous son nom décoré façon C (en __stdcall si le programmeur a bien fait les choses).
    Mais s'il écrit un fichier .def, il a la possibilité d'exporter la fonction sous n'importe quel autre nom, y compris son nom non-décoré. C'est cette option qui est préconisée par Microsoft, et c'est même obligatoire si tu veux créer un composant COM, car les bibliothèques Windows cherchent les fonctions sous leur nom non-décoré dans les DLLs (en théorie. En pratique, Windows est peut-être plus permissif).
    D'ailleurs, si tu ouvres une DLL Windows dans depends.exe, tu verras que ses fonctions C sont exportées sans leur décoration...

    Après, j'ignore comment sont faites les DLLs pascal, ni quel degré de liberté les compilos/linkers pascal laissent aux développeurs, mais je suppose que par défaut, la même convention est suivie... Mais je peux confondre avec VB. De toute façon, personnellement, quand je veux une DLL compatible multi-langage, j'en fais un composant COM.
    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. [Sources SDL] C/C++ --> Pascal/delphi
    Par fab56 dans le forum Contribuez
    Réponses: 5
    Dernier message: 30/05/2007, 23h58
  2. les unités (passage de pascal à delphi)
    Par hasboulatof dans le forum Delphi
    Réponses: 7
    Dernier message: 07/01/2007, 13h16
  3. appel procedure delphi
    Par bel_louiza dans le forum Delphi
    Réponses: 1
    Dernier message: 17/10/2006, 14h37
  4. PRocédure stocké, comment appeler avec delphi?
    Par SkyDev dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/04/2004, 18h20
  5. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07

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