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

API, COM et SDKs Delphi Discussion :

Aide pour communication avec DLL C++


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut Aide pour communication avec DLL C++
    Bonjour,

    Je cherche à utiliser une DLL C++ externe dans mon application Delphi.
    Mon problème est que je ne comprend pas comment accéder aux déclarations des fonctions vu qu'elles sont en C++.
    Voici un extrait du code (fichier complet en pièce jointe) :

    Code c++ : 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
    #pragma once
    namespace Rimage { namespace Rapid { namespace Impl {
     
    class InternClientSession;
    class WinSubclasser;
     
    }}}
     
    namespace Rimage { namespace Rapid { namespace Api {
     
    class Connection;
    class ISessionStatusListener;
    class IJobStatusListener;
    class IXmlModifyListener;
    class ServerAlert;
    class ImageOnlyJob;
    class ProductionOnlyJob;
    class ImageAndRecordJob;
     
    ...
     
    class SIMPLECLIENT_API ClientSession
    {
    public:
    	// No public constructor
    	virtual ~ClientSession();
     
    	virtual Connection* Connect(LPCTSTR clientId, LPCTSTR host=NULL, LPCTSTR port=NULL);
    ...

    Côté Delphi voici comment j'ai essayé d'y accéder :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    type
      RimageRapidApiConnection = record
      end;
      PRimageRapidApiConnection = ^RimageRapidApiConnection;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        FPRimageRapidApiConnection: PRimageRapidApiConnection;
      end;
     
    var
      Form1: TForm1;
     
      TRimageRapidApiClientSessionConnect: function(ClientID: PAnsiChar; Host: PAnsiChar = nil; Port: PAnsiChar = nil): PRimageRapidApiConnection; cdecl;
      function fRimageRapidApiClientSessionConnect(const ADLLHandle: HModule; AClientID: PAnsiChar; AHost: PAnsiChar = nil; APort: PAnsiChar = nil): PRimageRapidApiConnection;
     
    implementation
     
    {$R *.dfm}
     
    function fRimageRapidApiClientSessionConnect(const ADLLHandle: HModule; AClientID: PAnsiChar; AHost: PAnsiChar = nil; APort: PAnsiChar = nil): PRimageRapidApiConnection;
    begin
      Result := nil;
      try
    //    @TRimageRapidApiClientSessionConnect := GetProcAddress(ADLLHandle, 'Rimage.Rapid.Api.ClientSession.Connect');
    //    @TRimageRapidApiClientSessionConnect := GetProcAddress(ADLLHandle, 'Rapid.Api.ClientSession.Connect');
    //    @TRimageRapidApiClientSessionConnect := GetProcAddress(ADLLHandle, 'Api.ClientSession.Connect');
    //    @TRimageRapidApiClientSessionConnect := GetProcAddress(ADLLHandle, 'ClientSession.Connect');
        @TRimageRapidApiClientSessionConnect := GetProcAddress(ADLLHandle, 'Connect');
        if Assigned(TRimageRapidApiClientSessionConnect) then
          Result := TRimageRapidApiClientSessionConnect(AClientID, AHost, APort);
      except
        //
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      DLLHandle: THandle;
    begin
      DLLHandle := LoadLibrary(PChar(ExtractFilePath(Application.ExeName) + 'Rimage.Rapid.Api.dll'));
      if DLLHandle >= 32 then
      begin
        FPRimageRapidApiConnection := fRimageRapidApiClientSessionConnect(DLLHandle, 'test');
        if FPRimageRapidApiConnection <> nil then
          ShowMessage('cool');
        FreeLibrary(DLLHandle);
      end;
    end;
     
    end.
    J'ai essayé quelques variantes mais sans trop savoir quoi modifier et surtout sans succès.

    Du coup si quelqu'un à une idée ou une piste pour moi...

    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    c'est en théorie réalisable, en pratique c'est assez complexe.

    de ce fait, la solution généralement utilisée est de passer par un "wrapper", une DLL C/C++ qui expose les objets sous forme de fonctions. Le sujet a été abordé plusieurs fois déjà.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Merci.

    J'avais déjà ouvert mon VisualStudio mais j'ai tenté ma chance au cas ou quelqu'un aurait découvert un moyen

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    selon la documentation, il existe une version .NET

    The Rapid API has been compiled using the Visual Studio 2005 VC8 compiler
    Microsoft Visual C++ 2008 SP1 Redistributable Package is required.

    The Rapid API has been compiled using Visual Studio 2005 and .NET Version 2.0.
    Et dans cas, il y a plus simple, via Visual Studio.NET hérite les classes une par une en y ajoutant l'interop-COM
    Ainsi, tu pourrais importer cette nouvelle assembly interop-COM comme une TLB classique et ainsi l'utiliser toujours comme un Objet

    Mon responsable a procédé ainsi pour Crystal Report 2008

    Si tu veux utiliser la version du C++ (cela me semble plus pénible)
    Il existe aussi C++Builder qui peut le faire pas forcément besoin de VisualStudio !
    C++Builder te fournira un accès au classe exportée par ta DLL C++ et en plus te fournira la VCL

    Personnellement, je préfère encapsuler via des Interfaces (DelphiInterface en C++Builder)
    Ainsi, au lieu de remettre tout à plat, et d'avoir bcp de fonctions avec bcp de paramètres, on conserve un code OO proche !
    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

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

Discussions similaires

  1. Communication avec DLL (CWnd)
    Par Taron31 dans le forum MFC
    Réponses: 5
    Dernier message: 06/03/2006, 19h03
  2. [3D] Aide pour développer avec delta3D
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 06/02/2006, 13h56
  3. [Dev-C++] Aide pour programmer avec Qt 4
    Par stone dans le forum EDI
    Réponses: 3
    Dernier message: 02/02/2006, 08h58
  4. Aide pour projet avec carte asi candibus
    Par sinicha dans le forum C
    Réponses: 13
    Dernier message: 16/01/2006, 15h32
  5. [W3C] aide pour html avec mozilla et netscape
    Par teambeyou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/09/2005, 20h30

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