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 .NET Discussion :

Intégration DLL Win32


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut Intégration DLL Win32
    Bonjour,
    je début en Delphi.NET, et j'aimerais réutilisé une DLL Win32 dans mon Application Fiche VCL pour Delphi.NET.
    J'ai lu l'aide ici, mais j'ai du mal à le mettre en pratique.
    Pour l'instant mon projet est vide :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm1 = class(TForm)
      private
        { Déclarations privées}
      public
        { Déclarations publiques}
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.nfm}
     
    end.
    Quelqu'un pourrait-il me donner un exemple de code complet pour l'intégration d'une DLL, que je puisse voir à quel endroit et comment l'intégrer ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Regarde comment est fait l'unité Windows.pas, des appels de DLL il n'y a que ça dedans ... sinon la fonction recherche du forum ...
    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

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Jognu Voir le message
    Bonjour,
    J'ai lu l'aide ici, mais j'ai du mal à le mettre en pratique.
    C'est à dire ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    En fait, je viens de voir que j'avais un fichier Interface.pas et types.pas fournis avec la dll.
    Du coup si je les inclus à mon projet je peux appeler les fonctions.
    Le seul problème c'est que vu qu'ils sont prévus pour Win32, je n'arrive pas à les compiler dans mon projet.

    J'ai deux erreurs :
    [Pascal Erreur] Interface.pas(70): E2410 Les variables pointeur, les paramètres ou les constantes non protégés sont autorisés uniquement dans une procédure non protégée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // procedure permettant de lier une procédure
    procedure DllGetProc(var PointeurProcedure: Pointer; const NomProcedure: string);
    Et deux :
    [Pascal Erreur] Interface.pas(163): E2089 Transtypage incorrect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DllHandle := LoadLibrary(PChar(nomDll));
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PointeurProcedure := GetProcAddress(DllHandle, PChar(NomProcedure));
    En réglant ces erreurs est-ce que je peux utiliser la dll sans passer par du VLI ?

    J'ai aussi essayé la deuxième méthode du lien, mais quand je créé mon interface, si ma fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TDLL_existe(const identifiant: TCodeUtilisateur): TAuthRetour;
    Il ne connaît pas TCodeUtilisateur et TAuthRetour.

    EDIT : si j'inclus types.pas à mon projet il les reconnaît. C'est la bonne méthode ?

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jognu
    Le seul problème c'est que vu qu'ils sont prévus pour Win32, je n'arrive pas à les compiler dans mon projet.
    Le code dont tu disposes ne prend pas en charge la compilation sous les 2 plateformes. Il ne te présente que la partie publique des classes, enfin à prioris vu les nom des unités citées.
    Mieux vaut utiliser les appels P/Invoke.

    Citation Envoyé par Jognu
    Il ne connaît pas TCodeUtilisateur et TAuthRetour.
    Moi non plus
    Ces classes sont-elles déclarées qq part ?

    Si c'est possible joint ta DLL et ces fichiers .pas.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Citation Envoyé par Jognu Voir le message
    EDIT : si j'inclus types.pas à mon projet il les reconnaît. C'est la bonne méthode ?
    Bien sur, c'est comme les fichiers .h en C++, un fichier Header, contenant les structures utilisées comme paramètre des fonctions, ainsi que les proprototypes de ces mêmes fonctions, donc tes fichiers interfaces et types sont tes équivalents du Header C++,
    EDIT : Types.pas, c'est une unité de Delphi, j'espère que ton unité s'appelle autrement !

    par contre, dans ton Delphi.Net, faut que tu cherche comment déclarer un code "unsafe" comme on peut le faire en C#, P/Invoke (System.Runtime.InteropServices ) est l'une des méthodes pour que le GC ne foute pas le bazard dans les DLL Win32 que tu souhaites utiliser

    L'autre solution, est de faire en Delphi Win32, un ActiveX qui encaspule la DLL Win32 (tu peux ainsi utiliser sans effort interfaces.pas et types.pas, sans devoir te palucher la syntaxe à la con DLLImport .Net), tu redéfinis les fonctions que tu as besoin en SafeCall dans ton Interface de l'ActiveX, ainsi tu peux recenser dans la bibliothèque des assembly cet ActiveX, le GC n'y verra que du feu ! mais cela revient à faire la méthode VLI ...
    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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Bien sur, c'est comme les fichiers .h en C++, un fichier Header, contenant les structures utilisées comme paramètre des fonctions, ainsi que les proprototypes de ces mêmes fonctions, donc tes fichiers interfaces et types sont tes équivalents du Header C++,
    EDIT : Types.pas, c'est une unité de Delphi, j'espère que ton unité s'appelle autrement !

    par contre, dans ton Delphi.Net, faut que tu cherche comment déclarer un code "unsafe" comme on peut le faire en C#, P/Invoke (System.Runtime.InteropServices ) est l'une des méthodes pour que le GC ne foute pas le bazard dans les DLL Win32 que tu souhaites utiliser

    L'autre solution, est de faire en Delphi Win32, un ActiveX qui encaspule la DLL Win32 (tu peux ainsi utiliser sans effort interfaces.pas et types.pas, sans devoir te palucher la syntaxe à la con DLLImport .Net), tu redéfinis les fonctions que tu as besoin en SafeCall dans ton Interface de l'ActiveX, ainsi tu peux recenser dans la bibliothèque des assembly cet ActiveX, le GC n'y verra que du feu ! mais cela revient à faire la méthode VLI ...
    D'accord, merci pour ces renseignements !
    Donc je vais inclure le fichier types, et je vais utiliser la méthode VLI pour faire ça. J'ai déjà commencé, je continue demain et je vous tiens au courant

    EDIT :
    alors, j'ai fait comme la méthode VLI dans la FAQ, mais ça ne fonctionne pas.
    Dans uses j'ai bien inclus Borland.Vcl.Win32 et mon .pas types (jusque là ça marche).
    Juste après les uses j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      type
     IWin32DLLInt = interface
      function StrToCodeUtilisateur(const chaine: shortString): TCodeUtilisateur;
     end;
    Il reconnaît TCodeUtilisateur.

    Ensuite je teste à la création de ma form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Tfenetre_principale.FormCreate(Sender: TObject);
    var MyDLL      : String;        // Nom complet de la DLL
        MyWin32DLL : IWin32DLLInt; // Interface contenant les fonctions exportées et non managées
         retour     : TCodeUtilisateur;
     
        begin
        MyDLL := ExtractFilePath(Application.ExeName) +'dll\Cnx.dll';
        ShowMessage(MyDLL);
     // Appel à travers l'interface
      if not SysUtils.Supports(MyDLL, IWin32DLLInt, MyWin32DLL)
      then ShowMessage('Ne peut charger Cnx.dll') // Erreur
      else retour := MyWin32DLL.StrToCodeUtilisateur('test');  // Appel de la fonction de la DLL non-managée
     
    end;
    Et quand je lance j'obtiens le message "Ne peut charger Cnx.dll".
    L'erreur est :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Je dois me tromper quelque part, mais je ne vois pas où !

    EDIT 2:
    j'ai testé la méthode P/Invoke (puisque à priori elle marcherait aussi très bien pour ce que je veux faire).
    Ca me donne :
    La signature de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function NomUtilParCode(const identifiant: TCodeUtilisateur): ShortString;
    Dans mon code : (TCodeUtilisateur correspond en fait à un ShortString)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport('Cnx.dll', CharSet = CharSet.Auto, EntryPoint = 'NomUtilParCode')]
    Function NomUtilParCode (const identifiant :string):string; external;
    Dans ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour := NomAppParCode('test');
    A l'exécution j'obtiens aussi comme message d'erreur :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Ca vient au moment du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour := NomAppParCode('test');
    D'où peut venir cette erreur ?

    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Je me permet de faire un double post, parce qu'à force d'éditer celui d'au-dessus on y comprend plus grand chose.

    J'ai tenté de faire un ActiveX en Win32 (dans un premier temps sans encapsuler la DLL).
    Est-ce normal que si je le compile je ne puisse pas l'importer dans mon projet .NET ? (il me fait la même erreur que si j'essaye d'importer la DLL Win32).
    Sinon j'ai cherché comment encapsuler la DLL, mais il n'y a malheureusement pas beaucoup de doc à ce sujet. Je dois importer la DLL dans l'activeX comme je le ferais pour un projet Win32 ?

Discussions similaires

  1. Comment charger une DLL win32 en C# de manière dynamique
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/06/2009, 18h38
  2. comment utiliser une DLL win32 en C??
    Par Jayceblaster dans le forum C
    Réponses: 8
    Dernier message: 31/03/2006, 12h49
  3. HWND de MFC à une DLL Win32
    Par Taron31 dans le forum MFC
    Réponses: 5
    Dernier message: 16/03/2006, 06h53
  4. [VB6] création dll win32 et appel par un autre programme
    Par Tankian85 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/03/2006, 08h21
  5. Comment créer une dll Win32 sous Delphi ?
    Par Mickey.jet dans le forum Langage
    Réponses: 8
    Dernier message: 16/06/2005, 15h38

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