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 :

Comment exporter une fonction dans un package BPL ?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut Comment exporter une fonction dans un package BPL ?
    Bonjour,

    Je souhaite créé un package BPL avec une fonction à appeler dynamiquement dans un autre programme C++.

    Comment faire ceci avec c++ builder ?

    J'y arrive en delphi, d'ailleurs l'exemple ici est simple : http://www.jcolibri.com/articles/pro...es_delphi.html

    Quel est l'équivalent du mot clé delphi "exports" en c++ ?

    J'ai essayé le code ci-dessous mais il ne fonctionne pas en compilant le package (uniquement si je crée explicitement une DLL).

    J'ai des erreurs de link.

    [ilink32 Erreur] Error: '__tpdsc__ Fmx::Forms::TForm' externe non résolu, référencé depuis C:\TEST\UNIT1.OBJ
    ...
    ...

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
     
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <FMX.Controls.hpp>
    #include <FMX.Forms.hpp>
    #include <FMX.Controls.Presentation.hpp>
    #include <FMX.StdCtrls.hpp>
    #include <FMX.Types.hpp>
     
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TLabel *Label1;
    	TLabel *Label2;
    	TButton *Button1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Déclarations utilisateur
    public:		// Déclarations utilisateur
    	__fastcall TForm1(TComponent* Owner);
    };
     
    extern "C" __declspec(dllexport) void AppelEcran();
     
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    //---------------------------------------------------------------------------
     
    #include <fmx.h>
    #pragma hdrstop
     
    #include "Unit1.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.fmx"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	Close();
    }
    //---------------------------------------------------------------------------
    void AppelEcran()
    {
    	Form1 = new TForm1(NULL);
    	Form1->ShowModal();
            delete Form1;
    }
    //--------------------------------------------------------------------------
    Merci

  2. #2
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Je viens d'effectuer d'autres tests et ça fonctionne si je mets autre chose que Form1 = new TForm(NULL);...

    J'ai le même problème si je mets ShowMessage("");

  3. #3
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    J'ai trouvé, il fallait mettre fmx dans les requires.

  4. #4
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Voici ce que j'ai mis :

    Fichier .H

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" {
    						__declspec(dllexport) void __stdcall AppelEcran();
    				}
    Fichier .CPP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __stdcall AppelEcran()
    {
    	Form1 = new TForm1(NULL);
    	Form1->Show();
    }
    Compilé en win32, ça fonctionne sans erreur et sans avertissement. Et avec un viewer de DLL, je visualise bien ma fonction AppelEcran

    Lorsque je compile en OsX : pas de problème.

    Lorsque je compile en iOs ou Android, j'ai ce message d'avertissement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'attribut __declspec 'dllexport' n'est pas supporté
    Le fichier .dylib ou .so est bien généré mais pas sur que la fonction soit exporté...

    1ère question : Avec quel logiciel puis-je ouvrir le .so / .dylib et vérifier que la fonction soit quand même exporté ?
    2ème question : Si la fonction n'est pas supporté (ce que je crains), de quel manière dois-je exporter la fonction ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/08/2006, 10h08
  2. Comment définir une fonction dans une iframe ?
    Par mercier133 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2006, 17h23
  3. Réponses: 3
    Dernier message: 24/03/2006, 10h20
  4. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  5. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54

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