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

C++Builder Discussion :

utilistion d'une dll perso .net


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut utilistion d'une dll perso .net
    Bonjour,

    J'ai réalisé une dll en c# avec visual studio. J'essaie maintenant d'utiliser cette dll dans C++Builder.

    Voici à quoi ressemble la dll en c# :
    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
    namespace libperso
    {
        public delegate void Onmachin1change(string Text);
        public delegate void Onmachin2change(string Text);
        public delegate void Onmachin3change(string Text);
        public delegate void Onmachin4change(string Text);
        public class classperso
        {
            ...
            public Onmachin1change Onmachin1changecallback;
            public Onmachin2change Onmachin2changecallback;
            public Onmachin3change Onmachin3changecallback;
            public Onmachin4change Onmachin4changecallback;
            public bool Start(){...}
            public void Stop(){...}
            public void Pause(){...}
            public bool Reprise(){...}
            ...
            void machin1change(...){...}
            void machin2change(...){...}
            void machin3change(...){...}
            void machin4change(...){...}
        }
    }
    J'utilise le fichier tlb généré pour utiliser la dll dans C++Builder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "libperso_TLB.h"
    Et ensuite dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classperso *x = new classperso();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [BCC32 Erreur] Unit1.cpp(6609): E2352 Impossible de créer une instance de la classe abstraite '_classperso'
    [BCC32 Erreur] Unit1.cpp(6609): E2353 La classe '_classperso' est abstraite parce que '__stdcall IDispatch::GetTypeInfoCount(unsigned int *) = 0'
    Et si je fais un "x->", il n'y a aucun rapport entre e que me propose C++builder et ce que j'ai mis dans le fichier c#.

    Comment puis-je faire pour utiliser cette dll sachant que je dois utiliser des fonctions de callbak ?
    C'est à dire que ma dll dois pouvoir lancer des évènements dans C++Builder.

    J'ai trouvé ce procédé en recherchant sur google. Sinon, faut-il faire ce que décrit l'article suivant sachant que c'est une dll fait en .net ?
    http://lfe.developpez.com/DLL/

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    J'ai pu avancé mais cela ne fonctionne toujours pas. J'ai trouvé cet article :
    http://msdn.microsoft.com/fr-fr/library/ms973802.aspx

    Et du coup, j'ai le code suivant :
    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
    using System;
    using ...
     
    namespace libperso
    {
        public delegate void Onmachin1change(string Text);
        public delegate void Onmachin2change(string Text);
        public delegate void Onmachin3change(string Text);
        public delegate void Onmachin4change(string Text);
     
        public interface Iinterfaceperso
        {
            bool Start();
            void Stop();
            void Pause();
            bool Reprise();
            void ClearGrammaire();
            void AjouterGrammaire(string expression);
        }
     
        public class classperso : Iinterfaceperso
        {
            ...
            public Onmachin1change Onmachin1changecallback;
            public Onmachin2change Onmachin2changecallback;
            public Onmachin3change Onmachin3changecallback;
            public Onmachin4change Onmachin4changecallback;
            public bool Start(){...}
            public void Stop(){...}
            public void Pause(){...}
            public bool Reprise(){...}
            ...
            void machin1change(...){...}
            void machin2change(...){...}
            void machin3change(...){...}
            void machin4change(...){...}
        }
    }
    J'ai donc maintenant une interface et j'ai passer toutes les étapes pour signer la dll et l'enregistrer. J'ai le fichier dll et le fichier tlb.

    Ensuite, ans C++Builder, je n'arrive toujours pas à utiliser ma classe. J'ai essayé d'importer le fichier tlb par le menu 'importer un composant".
    J'ai inclus le fichier "libperso_TLB.h"
    puis ensuite, je ne sais pas quoi faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       HRESULT hr = CoInitialize(NULL);
     
       Libperso_tlb::IinterfacepersoPtr myPtr(__uuidof(classperso));
     
       long lResult = 0;
       char buffer[256];
     
       // Call the Add method.
       myPtr->Start();
     
       // Uninitialize COM.
       CoUninitialize();
    Ce mode me retourne l'erreur suivante :
    [BCC32 Erreur] Unit1.cpp(51): E2108 Utilisation impropre de typedef 'IinterfacepersoPtr'
    Une idée ?

    Merci

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    J'ai modifié la dll et refait un import et maintenant, je n'ai plus qu'une ligne qui provoque une erreur de compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       CoInitialize(NULL);
     
        libperso_tlb::IinterfacepersoPtr p(__uuidof(libperso_tlb::classperso));
        libperso_tlb::classperso *r = p ;
        r->Start();
     
        CoUninitialize();
    Ce qui me donne toujours le même problème :
    [BCC32 Erreur] Unit1.cpp(64): E2108 Utilisation impropre de typedef 'IinterfacepersoPtr'
    Une idée ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    J'ai essayé de suivre ce cours :
    http://nico-pyright.developpez.com/t...p2/#Lcominteop

    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
      DISPID dispid;
      IDispatch *pDisp;
      OLECHAR *methodName = L"Start";
      CLSID clsID;
      DISPPARAMS param;
      param.cArgs=0;
      param.rgvarg=NULL;
      param.cNamedArgs=0;
      param.rgdispidNamedArgs=NULL;
     
      CoInitialize(NULL);
      if (SUCCEEDED(::CLSIDFromProgID(L"libperso.classperso", &clsID)))
        if (SUCCEEDED(CoCreateInstance(clsID, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pDisp)))
          if (SUCCEEDED(pDisp->GetIDsOfNames(IID_NULL, &methodName,1, GetUserDefaultLCID(), &dispid)))
            if (SUCCEEDED(pDisp->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &param, NULL, NULL, NULL)))
              pDisp->Release();
      CoUninitialize();
    Le dernier "if" n'est pas positif et du coup, la ligne "pDisp->Release();" n'est jamais parcourue.
    Du coup, je pense que la fonction n'est jamais lancée.

    Au moins, il n'y a pas d'erreur de compilation et pas d'erreur d'exécution.

    Toujours aucune idée ?

    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    J'ai trouvé. J'avais fait 2 erreurs.

    La première est la non gestion de la valeur de retour de la commande Start (bool) et la 2ème c'est que j'utilise une fonction disponible sous windows 7 du framework .NET 4.0 beta2 qui n'est pas complètement présente sous Windows XP et mon système de développement est sous XP.

    Par contre, je n'arrive pas à faire fonctionner le programme en passant par une interface comme dans cet exemple :
    http://nico-pyright.developpez.com/t...p2/#Lcominteop

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

Discussions similaires

  1. Chargement d'une DLL perso mais echec du GetProcAddress
    Par marco2090 dans le forum Visual C++
    Réponses: 2
    Dernier message: 14/07/2011, 09h16
  2. Débutant : utiliser des objets d'une dll perso
    Par julien20vt dans le forum ASP.NET
    Réponses: 9
    Dernier message: 28/04/2010, 11h27
  3. Utiliser une Dll perso
    Par grutt dans le forum C++
    Réponses: 2
    Dernier message: 11/06/2009, 12h17
  4. Utilisation d'une dll perso sur SAS
    Par rlongin dans le forum SAS Base
    Réponses: 2
    Dernier message: 12/08/2008, 13h41
  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