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 :

Comment accéder à une DLL COM depuis un exécutable ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Comment accéder à une DLL COM depuis un exécutable ?
    Bonjour,
    j'ai écrit un serveur com installé sur un serveur IIS. J'appelle ses fonctions via asp et tout baigne javascript:emoticon('')
    Je soushaite accéder à ces fonctions depuis un exe écrit avec Delphi depuis un poste distant, la dll se charge bien, mais je ne peux accéder à la fonction javascript:emoticon('')

    Merci de votre aide. Voici mon code:
    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
    procedure Tfm_main.testDycasrv;
    type TGetCodeU = function(compteur: OleVariant): OleVariant;
    var  libHandle: THandle;
         err: word;
         getCodeU: TGetCodeU;
         s: string;
         n: integer;
    begin
              s := '\\MONSERVEUR\TOTO\scripts\pdycasrv.dll';
              libHandle := SafeLoadLibrary(s);
              if libHandle <> 0 then
              begin
                  try
                     @getCodeU := getProcAddress(libHandle, 'getcodeu');
                     err := getLastError;
                     if @getCodeU <> nil then
                     begin
                         n := getCodeU('compteur');
                         mm_connexion.Text := intToStr(n);
                      end else mm_connexion.Text := s + chr(13) + 'Erreur: ' + intToStr(err);
                  finally
                      freeLibrary(libHandle);
                  end;
              end;
    end;
    [Modération]
    Merci de penser à la balise Code, NoisetteProd

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    si tu as fait un serveur COM comme tu le dis, la manière dont tu y fais appel est bizarre.

    si par contre, tu as fais une dll, alors est-tu bien sûr d'avoir exporté la fonction getCodeU.

    c'est à dire y a t il qqch comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    exports
      getcodeu name 'getcodeu';
    dans ton code ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse.
    C'est bien un serveur com qui me permet de publier des fonctions que j'appelle depuis mes pages asp.
    C'est effectivement une dll qui est créée. Et c'est elle dont je souhaite utiliser des fonctions depuis mon exe.
    Voici (ci-dessous) le source de ma librairie. C'est dans "udycasrv" qu'est déclarée/implémentée ma fonction "getcodeu".
    J'ai essayé de rajouter une clause ligne
    getcodeu name 'getcodeu'
    comme tu me le conseilles, mais getcodeu n'est pas visible de là.
    Merci encore car je patauge dans la semoule...
    source:
    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
     
    library pdycasrv;
     
    {%File 'dycasrv.asp'}
     
    uses
      ComServ,
      pdycasrv_TLB in 'pdycasrv_TLB.pas',
      udycasrv in 'udycasrv.pas' {dycasrv: CoClass};
     
    exports
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer;
     
    {$R *.TLB}
     
    {$R *.RES}
     
    begin
    end.
    [Modération]
    Merci de penser à la balise Code, NoisetteProd

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    comme c'est un serveur COM, ne met pas getcodeu dans les exports.

    ce que tu dois faire c'est aller dans le projet qui est censé l'utilisé.
    faire
    menu->importer une bibliothèque de type

    trouver ta bibliothèque de types

    et ensuite cliquer sur le bouton créer l'unité

    tu récupères dans ton projet un fichier TLB_PAS qui contiendra une classe encapsulant l'interface que tu recherches.

    dans cette unité, il y a une fonction qui ressemble à qqch comme

    CoGetCodeU.Create qui renvoie une instance du serveur.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    j'oubliais il faut que le serveur soit recensé sur le poste, comme c'est une dll, il faut que tu exécutes la lignes de commande

    regsvr32.exe <chemin de ta dll>

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est vraiment génial...
    Par contre, le top serait que je puisse utiliser qqchose comme:
    service := CoDycasrv.createRemote(('MONSERVEUR/TOTO/');

    mais j'ai des difficultés avec la syntaxe du chemin à passer à CreateRemote.
    Ma dll est active et tourne sur le serveur distant, mais que j'indique le nom du serveur, son adresse IP, le chemin du répertoire où se trouve la dll, j'obtiens l'erreur:
    "Le serveur RPC n'est pas disponible"
    Est-ce un pb de syntaxe, de droits?
    Merci de ta réponse si tu ne te lasses pas!

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Je ne sais pas faire marcher CreateRemote(je n'ai pas beaucoup insisté d'ailleurs)

    En gros j'utilise Create tout court

    Par contre je configure sur le poste client à l'aide de dcomcnfg.exe

    l'idéal étant bien sûr de le faire à l'installation du programme si ton appli est censé tourné sur un poste client. là faut aller enregistrer des clés dans ton appli

    Mais bon dans un premier temps :

    tu enregistres ton serveur avec regsvr32.exe
    tu lances dcomcnfg.exe
    tu localises ton serveur
    tu ouvres les propriétés de ton serveur
    tu vas sur l'onglet emplacement
    tu coches exécuter l'application sur l'ordinateur suivant

    ensuite, il faut configurer les droits d'accès dans l'onglet sécurité.

    il faut configurer sur le poste client et sur le poste serveur.

    là c'est moins clair dans ma tête. Essaie de trouver de la doc la-dessus. (google)

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup de ton aide et de ton temps.
    Je vais assayer d'approfondir le createRemote car il permettrait à mon client d'installer mon exe simplement.
    Sinon, j'utiliserai ta solution.
    Bonne semaine et félicitations pour ta clarté.

    Cordialement

    Denys

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Tu as dit que ton serveur COM est une dll, donc c'est ce que l'on appelle un serveur in-process. Ces serveurs ne sont pas "appellables" en dehors du processus d'une application, donc certainement pas à partir d'une machine distante.

    La procédure CreateRemote n'est valable qu'avec des serveurs automation, des serveurs out-process.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    J'oubliais une chose ... Si tu veux travailler sur un objet COM à partir d'une machine distante, tu as le choix entre travailler façon DCOM ou via le SocketServer de Borland.
    Perso, je travaille depuis longtemps avec le SocketServer et je n'ai jamais eu de problème. De plus, c'est bien plus simple à configurer.

    Voilà.

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de ton précieux avis.
    Je vais essayer ta proposition.
    Bonne journée

    Denys

Discussions similaires

  1. [Débutant] comment accéder à une base sqlite depuis une application windows mobile
    Par binother dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 28/12/2012, 11h31
  2. Réponses: 4
    Dernier message: 23/04/2008, 15h29
  3. [D7] Comment accéder à une Form depuis son nom ?
    Par dacid dans le forum Langage
    Réponses: 7
    Dernier message: 17/12/2007, 08h52
  4. Réponses: 5
    Dernier message: 11/09/2007, 11h32
  5. [COM] Comment utiliser une dll DotNet dans un projet win32 ?
    Par Marmottoc dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 05/05/2006, 15h58

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