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 :

[C#] Comment utiliser des dll win 32 dans un projet .NET


Sujet :

Delphi .NET

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut [C#] Comment utiliser des dll win 32 dans un projet .NET
    Voila j'ai un petit problème ( et oui encore!!!)
    Je dois utilisé une dll (qui n'est pas en .NET mais en win32) distribuée par National Instruments (NIDaqmxBase.dll) dans un projet .NET en C# sous delphi 2005 mais je ne sais pas comment faire ni meme si c'est possible?
    je sais que sous delphi5 on pouvait faire appelle à des procédures d'une dll qui se trouver sur le disque. est ce que ceci est encore possible et si oui comment je dois faire?

  2. #2
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Si tu programmes en C# tu n'est pas dans le bon forum, le sais-tu ?

    Recherche dans le SDK .NET P/Invoke.
    http://msdn.microsoft.com/msdnmag/issues/03/07/NET/

    QR de la FAQ Delphi .NET en cours de réalisation :
    Comment puis-je appeler une fonction présente dans une DLL win32 ?
    Virtual Library Interfaces ou comment ajouter l'appel dynamique à P/Invoke
    Présenté par Olivier Dahan lors des Borland Devtracks (Mars 2005).

    Voir l'aide en ligne : ms-help://borland.bds3/bds3dnetguide/html/VirtualLibraryInterfaces.htm
    - Simplifie l’importation de DLL Win32 sous .Net
    - Ajoute la flexibilité indispensable pour le « Late Binding » absent de P/Invoke

    Probléme avec P/Invoke : peu pratique, verbeux, le nom de la DLL ou son chemin ne peut être résolu au runtime si la DLL n’est pas trouvée cela provoque une erreur d’exécution.

    Déclaration originale dans la DLL Win32 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Function ConvertCtoF(CentValue: Integer): Integer; stdcall;
     Function ConvertFtoC(FahrValue: Integer): Integer; stdcall;
    Déclaration typique P/Invoke sous .Net utilisant les attributs personnalisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     [DllImport('Win32DLL.dll', CharSet = CharSet.Auto, EntryPoint = 'ConvertCtoF')]
      Function ConvertCtoF; external;
     [DllImport('Win32DLL.dll', CharSet = CharSet.Auto, EntryPoint = 'ConvertFtoC')]
      Function ConvertFtoC; external;
    Un exemple VLI
    Il est nécessaire d'effectuer les trois opérations suivantes :

    1 - Ajouter Borland.Vcl.Win32 à la clause uses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Uses Borland.Vcl.Win32;
    2 - Déclarer une interface contenant les fonctions exportées et non managées que vous souhaitez appeler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
     // Il n'est pas nécessaire d'utiliser l'attribut DllImport sur ce prototype.
     IWin32DLLInt = interface
      function ConvertCtoF(CentValue: Integer): Integer;
      function ConvertFtoC(FahrValue: Integer): Integer;
     end;
    3 - Appeler la fonction Supports pour vérifier que la DLL non managée existe et que les fonctions dans la déclaration d'interface sont vraiment exportées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var MyDLL      : String;        // Nom complet de la DLL
        MyWin32DLL : IWin32DLLInt; // Interface contenant les fonctions exportées et non managées
    begin
     MyDLL := ExtractFilePath(Application.ExeName) +'\mylib\Win32DLL.dll';
     
     // Appel à travers l’interface
      if not SysUtils.Supports(MyDLL, IWin32DLLInt, MyWin32DLL)
      then Writeln('Ne peut charger Win32DLL.dll') // Erreur
      else NewInt := MyWin32DLL.ConvertCtoF(100);               // Appel de la fonction de la DLL non-managée
    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
     
    program FaqDLL;
     
    {$APPTYPE CONSOLE}
     
    uses
     Borland.Vcl.Win32,
     SysUtils;
     
    type
     // Il n'est pas nécessaire d'utiliser l'attribut DllImport sur ce prototype.
     IWin32DLLInt = interface
      function ConvertCtoF(CentValue: Integer): Integer;
      function ConvertFtoC(FahrValue: Integer): Integer;
     end;
     
    var MyDLL      : String;       // Nom complet de la DLL
        MyWin32DLL : IWin32DLLInt; // Interface contenant les fonctions exportées et non managées
        NewInt     : Integer;
    begin
     MyDLL := ExtractFilePath(Environment.GetCommandLineArgs[0]) +'\mylib\Win32DLL.dll';
     
     // Si la fonction Supports renvoie True, la DLL prend en charge toutes les fonctions nommées dans
     // la déclaration de l'interface, et vous savez donc que leur appel est sans danger.
      if not SysUtils.Supports(MyDLL, IWin32DLLInt, MyWin32DLL)
      then Writeln('Ne peut charger Win32DLL.dll') // Erreur
      else NewInt := MyWin32DLL.ConvertCtoF(100);               // Appel de la fonction de la DLL non-managée
     
     Readln;
    end.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup pour l'info et excuse moi je n'ai pas vu que j'étais dans le mauvais forum.

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/08/2014, 16h26
  2. Réponses: 0
    Dernier message: 02/04/2011, 20h22
  3. Réponses: 0
    Dernier message: 26/05/2010, 22h57
  4. utiliser une DLL 2.0 dans un projet 1.1
    Par Spoonnny dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/01/2008, 13h22
  5. Comment utiliser des dll C++ dans un projet C# ?
    Par kreitech dans le forum C#
    Réponses: 5
    Dernier message: 20/02/2007, 16h49

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