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

 Delphi Discussion :

Utiliser une DLL en C++ sous Delphi


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut Utiliser une DLL en C++ sous Delphi
    Bonjour,
    Je dois développer une application sous Delphi qui me permettra de lire la valeur d'une sonde de puissance du fabricant Mini-Circuit(PWR-SEN-4GHS)
    Le fabricant fourni une DLL (cf fichier zip : mcl_pm64.zip) avec de "légères" explications d'utilisation dans un fichier text (cf fichier joint 'mcl_pm_dll_ReadMe.txt')
    Le problème, c'est qu'il n'y a pas les explications pour Delphi et je ne connais pas les autres langages.
    Je ne vois pas du tout comment utiliser cette DLL.
    Quand j'ouvre le fichier DLL avec Delphi toutes les fonctions apparaissent dans une arborescence et en regardant le fichier txt, il semblerait qu'il faille déclarer un variable pm1 :

    en visual C++ ca donne :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
     mcl_pm64::usb_pm ^pm1 = gcnew mcl_pm64::usb_pm();

    mais je ne vois pas du tout comment le transcrire en Delphi.

    mon bout de code ressemble a ça :

    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
    var
      Form5: TForm5;
     
     
    //** Déclaration DLL *********************************************************\\
    const
      NomDLL = 'mcl_pm64.dll';
     
        Function Open_Sensor(SN: String):SmallInt; external NomDLL;
    //****************************************************************************\\
    //Type
    //  pm1 = mcl_pm64.usb_pm;
     
    implementation
     
     
    {$R *.dfm}
     
    procedure TForm5.Button2Click(Sender: TObject);
    var
        //pm1 : mcl_pm64.usb_pm();
    begin
          //pm1:=mcl_pm64.usb_pm.create(self)
          //Form5.caption:=IntToStr(Open_Sensor('11107040004'));
    end;
     
    end.
    Les différentes déclarations de pm1 sont autant d'essais infructueux avec pour reponse :
    [DCC Error] Unit5.pas(44): E2003 Undeclared identifier: 'mcl_pm64'
    Quelqu'un saurait il m'aider pour pouvoir utiliser cette fonction Open_Sensor avec la bonne déclaration de variable?
    Par avance, merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut


    Tu as lu le ReadMe, juste la 1ère ligne

    mcl_pm64.dll - 64 bit COM Object for programmers under 64 bit operating system
    Tu es mal baré !
    Delphi est 32Bits uniquement et ne peux utiliser que des DLL 32Bits !
    en plus cet DLL est un objet COM qu'il faut enregistrer regsvr64.exe, ensuite il faut importer la bibliothèque de type !
    Ce n'est pas une simple DLL avec des fonctions exportées, cela utilise des interfaces pour échanger des objets !
    Si tu es débutant, ce n'est pas par là que tu devrais commencer !

    Important : Demande à ton fournisseur mcl_pm32.dll

    Déjà OpenSensor utilise le type String ???
    Cela me semble peut probable, je penche pour BSTR\WideString
    Tu n'as pas précisé de convention d'appel ? safecallà tous les coups pour le COM
    Mais pas avec external mais dans une interface, c'est tout autre mécanisme que tu n'as pas à écrire, c'est l'importateur de TLB qui génère un Wrapper !
    Mais pour du 32Bits !

    Ce fabricant, je l'espère fourni une documentation et\ou un fichier H en C
    Etudie-le et traduit !
    Tu n'as rien de plus que ce petit ReadMe ? en même temps, un code C++ c'est certe un peu rebutant au départ mais avec des efforts ça ce comprend !

    Le problème, c'est qu'il n'y a pas les explications pour Delphi et je ne connais pas les autres langages.
    Tu ne connais pas vraiment Delphi non plus ?

    Allez, une petite leçon

    en visual C++ ca donne :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    mcl_pm64::usb_pm ^pm1 = gcnew mcl_pm64::usb_pm();
    mcl_pm64:: - mcl_pm64 est le nom d'un NameSpace, plus ou moins une unité en Delphi ...
    mcl_pm64 soit est fourni avec la DLL soit c'est fichier généré par l'importateur de Type de VSC++ ou .NET
    :: est l'opérateur de portée, en delphi cela sera .
    usb_pm est un type, probablement struct ou class
    ^pm1 - la je sêche ! ^ c'est normalement un XOR en C++ Builder, j'aurais dit *pm1 ou alors VSC++ aurait utilisé ^ pour un type spécial de pointeur (oh les copieurs), interressant, à étudier !

    gcnew ? garbage collector new ? est-ce l'équivalent des DelphiInterface avec compteur de Référence en VSC++ ?
    gcnew mcl_pm64::usb_pm(), avec le new, on devine un constructeur, qui serait Create en Delphi !

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    Status = pm1->Open_Sensor(SN);
    tu n'as pas remarqué le -> équivalent du . en Delphi
    Open_Sensor est une méthode de l'instance pm1

    tu ne semble pas bien faire la différence entre les méthodes (POO) et les fonctions (Procédural)

    TOUT développeur doit savoir lire du C\C++, cela reste le langage à base de tout !
    C'est l'occasion d'apprendre !

    Attend Delphi Pulsar XE2, il fournira le 64Bits !
    Présentation au CodeWay !
    Que la force de Chimpenfeu soit avec toi !

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Bonjour,
    Merci de cette réponse détaillée.
    Effectivement je suis débutant en Delphi : aucune formation, j'apprends en faisant et comme programmer n'est qu’occasionnel dans mon boulot, je n'avance pas vraiment.
    Mais avant de m'attaquer a cet appareil, j'avais réalisé une DLL, simple, certes, pour un générateur de fonction Agilent, je m'imaginais donc que je pourrais utiliser la DLL du fournisseur de la même manière.
    Pour la DLL, je l'ai aussi en 32bits mais comme je suis sous win7 x64 je pensais que je devais prendre la x64
    Pour la documentation du fournisseur, les pdf ne parlent que de l'utilisation de l'interface graphique du logiciel fourni. Quand a l'utilisation de la DLL, je n'ai que le fichier TXT. Avant de poster sur ce forum, j'avais auparavant demander des explications au fournisseur, mais pas de réponse.
    Pour le ->, j'avais bien pense au . de Delphi
    Quand au 'gcnew mcl_pm64::usb_pm()', j'avais bien pense aussi au Create
    et effectivement, je ne fais pas la différence entre les méthodes (POO) et les fonctions (Procédural).

    Merci encore de tes explications, je vais essaye de me débrouiller.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    En fait il fallait faire la manip suivante :
    Ouvrir delphi en mode admisnistrateur
    Component - Import Component - Import ActiveX control
    Aller chercher la DLL (32bits) qui aura ete place sous windows\system32

    Delphi crée alors un fichier 'pas' (avec toutes les fonctions lisibles) ('nomde la dll'_TLB) qu'on peut ensuite utiliser dans son prog avec un uses

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    et avant ça avoir exécuter en administrateur la commande
    regsvr32 c:\windows\system32\nom de la DLL

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Je te réponds un peu tard, juste pour le vocabulaire

    Delphi crée alors un fichier 'pas' (avec toutes les fonctions lisibles) ('nomde la dll'_TLB)
    C'est ce que j'appelais le Wrapper (classe d'encaspsulation) généré par l'importateur de TLB

    et avant ça avoir exécuter en administrateur la commande
    regsvr32 c:\windows\system32\nom de la DLL
    Evidemment, c'est un objet COM, regsvr32.exe permet d'enregistrer la classe dans la base de registre et ainsi via son GUID cela sait où trouver la DLL et instancier l'objet interfacé.

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

Discussions similaires

  1. Utiliser une DLL ecrite en VB.NET sous Delphi
    Par vg-matrix dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2012, 11h50
  2. Réponses: 2
    Dernier message: 27/04/2010, 12h14
  3. Utiliser une DLL Matlab sous Delphi
    Par airefrais dans le forum Langage
    Réponses: 4
    Dernier message: 24/07/2009, 10h16
  4. Utilisation une Dll en c avec delphi
    Par yann87 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 22/12/2008, 16h14
  5. Réponses: 1
    Dernier message: 18/07/2006, 16h44

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