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
    [email protected]

  2. #2
    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
    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 505
    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 505
    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 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
    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 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
    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 505
    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 505
    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 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
    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 505
    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 505
    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 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
    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