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

  1. #21
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Je viens de faire une fonction addition dans l'activeX qui renvoit juste l'addition de deux nombres (sans lien avec la DLL Win32, juste pour voir si j'arrive à l'appeler depuis mon application .NET, et ça marche). Je repars donc sur l'encapsulation.
    Attention! Qu'est ce qu'un activeX ? De manière simple c'est un programme qui s'exécute sur le poste du client généralement à l'intérieur d'une fenêtre windows. Donc ce programme aura besoin des dll requises sur le poste du client. Ce qui marche sur ton poste ne marchera pas forcément sur le poste de l'utilisateur final ! Comme tu débutes en .NET tu te pose les mêmes questions que nous nous sommes posés avec Delphi 8 NET et versions suivantes. Avant donc de débuter ton projet il convient de faire un état des lieux de ce que tu souhaites réaliser.

  2. #22
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    En fait ce n'est pas un ActiveX, c'est un terme honteusement galvaudé que j'utilise quand je parle d'un projet bibliothèques de types et que l'on met dedans un objet automation, j'utilise ce terme car je crée toujours mon objet automation dans un projet "Bibliothèque ActiveX"

    Sinon, Jognu, comme je te l'ai dit, tu fois définir TCodeUtilisateur sous la forme d'une interface ICodeUtilisateur, comme je l'ai fait dans mon exemple pour TResultStruct et TResultStructImpl \ IResultStruct, avec une propriété ID par exemple de type WideString, ce que tu es en train de faire est une encapsulation complète, il est possible que certains objets soit différents ...

    bon si dans ton cas, ce n'est qu'un shortstring, ne te complique pas la vie, utilise le type WideString partout ... mais cela se compliquera si tu veux faire évoluer ton TCodeUtilisateur dans la DLL, il te faudra repenser ton ActiveX ... donc en partout tout de suite sur une interface, tu laisses ouvert plus de porte ...

    WideString (ou BSTR) n'est pas soumis au compteur de référence comme le serait le AnsiString (merci de confirmer ou d'infirmer si quelqu'un sait exactement), et donc ShareMem n'est pas utile, en tout cas, j'ai mis des WideString dans mes structures, et j'ai filé mes deux DLL (Win32 + Encapsulation ActiveX) et je n'ai pas du tout mis ShareMem, et l'utilisateur de ma DLL en VB.Net n'a pas de problème ...

    Evidemment, mon exemple n'est que dans l'idée, ... je n'ai pas mis le détail du loadlibrary pensant que tu l'avais déjà fait ... dans mon ActiveX j'ai une unité qui est dédié à charger les fonctions, cela donne ... je voudrais pas dire, mais tu as j'espère déjà fait de liaison dynamique de DLL en Win32 ??? Car si tu n'en as pas fait, j'ai l'impression qu'on tourne en rond ...

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    unit Shai_Header;
     
    interface
     
    uses ...
     
    function ShaiFunction(const lpParam: TParamStruct): TResultStruct; 
    function AutreFunction(Truc: PChar): TResultStruct; 
     
     
    implementation
     
    var
      APIHandle: THandle = 0;
      APIFunctions: record
        _ShaiFunction: function(const lpParam: TParamStruct): TResultStruct; stdcall; // tu note _ !
        _AutreFunction: function(Truc: PChar): TResultStruct; // j'en ai tout un tas ...
      ...
      end;
     
    // la fonction magique qui charge tout mes fonctions
    procedure InitFunction(const FunctionName: string; var FunctionHandle: Pointer);
    var
      ModuleFileName: string;
    begin
      if FunctionHandle = nil then
      begin
        if APIHandle <= 0 then
        begin
          ModuleFileName := ExtractFilePath(WindowsEx.GetCurrentModuleFileName()) + '***.dll';
          APIHandle := LoadLibrary(PChar(ModuleFileName));
        end;
     
        if APIHandle > 0 then
        begin
          FunctionHandle := GetProcAddress(APIHandle, PChar(FunctionName))
        end
        else
        begin
          raise EOleExceptionShai.Create(ERR_MAPPING_COM_API_NOT_FOUND);
        end;
      end;
     
      if FunctionHandle = nil then
      begin
        raise EOleExceptionShai.Create(ERR_MAPPING_COM_API_FUNCTION_NOT_FOUND);
      end;
    end;   
     
     
    function ShaiFunction(const lpParam: TParamStruct): TResultStruct; 
    begin
      InitFunction('ShaiFunction', @APIFunctions._ShaiFunction);
      Result := APIFunctions._SearchPatient(lpParam);
    end; 
     
     
    function AutreFunction(Truc: PChar): TResultStruct; 
    begin
      InitFunction('AutreFunction', @APIFunctions._AutreFunction);
      Result := APIFunctions._AutreFunction(Truc);
    end;
    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. #23
    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
    Merci.
    Petite question qui n'a rien à voir (mais qui pourrait me simplifier grandement la tâche) : serait-il plus simple d'utiliser cette DLL à partir d'un webservice ?
    Il serait effectivement plus pratique pour mon projet d'avoir un webservice plutôt qu'une DLL.
    Est-il possible d'utiliser la DLL (ou de l'intégrer à partir des sources) dans un webservice ?

    J'ai l'impression que personne n'en parle sur le web, c'est peut-être une idée complètement absurde.

  4. #24
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Bien sur, tu peux imaginer tout sorte d'encapsulation, tu peux effectivement au lieu de faire un ActiveX faire un WebService qui se branchera sur IIS, ainsi tu pourras de n'importe quel ordinateur ayant un accès au Serveur Web via HTTP appeler ton WebService, celui-ci appelant en fait la DLL locale ... j'ai déjà vu ce procédé ... maintenant, est-ce que c'est plus simple, ben tout dépend si tu maitrise mieux le déploiement, l'invocation depuis Delphi.Net et l'implémentation en Delphi 7 !!!

    Après, tu as commencé en ActiveX, autant le finir (rien que pour la connaissance personnelle acquise des DLL Win32 et des interfaces pour le modèle COM), tu pourras très bien invoqué celui-ci depuis le WebService ...

    Regarde par exemple XMLRAD, c'est Serveur ISAPI en Delphi, derrière, il y a tout un ensemble de DLL, ...

    Et regardons plus largement, tu développe un WebService, celui-ci utilise plein de DLL sans que tu t'en apercoive, comme les DLL du IXMLDOMDocument qui est utilisé pour générer le XML du SOA ..., donc avoir sa propre DLL interne n'a rien de choquant !
    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

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