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 :

Client COM dans un composant VCL


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Par défaut Client COM dans un composant VCL
    Bonjour,

    Sous BCB6, j'ai créé un composant qui encapsule un client COM/DCOM.
    Ce composant dispose d'une fenêtre de configuration, qui permet entre autre la connexion à un serveur COM.

    Le composant fonctionne parfaitement si je l'utilise dans un projet.

    Par ailleurs, j'ai ajouté la possibilité d'appeler la fenêtre de config dans l'IDE. (paquet design uniquement incluant un RegisterComponentEditor sur ma fenêtre de config, définie dans le paquet runtime).

    Là, ça se complique!
    Si je double-clique sur le composant, ma fenêtre de config s'ouvre normalement.
    Si je tente la connexion à un serveur COM, j'obtiens alors une erreur :
    (message box "_ASSERTE"):
    "p!=0 @ c:\program files\borland\cbuilder6\include\atl\atlbase.h/509"
    "Press Yes to terminate, no to continue and cancel to debug".
    Ce message est suivi d'un suivant indiquant "External exception 80000003", et enfin un troisième indiquant une violation d'accès dans mon bpl runtime.

    Que se passe-t-il ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    pour moi ça correspond à la ligne :

    _NoAddRefReleaseOnCComPtr<T>* operator->() const
    {
    ATLASSERT(p!=NULL);
    return (_NoAddRefReleaseOnCComPtr<T>*)p;
    }
    je ne connais pas bien l'implementation COM,
    cependant cet assertion a été mise pour empecher de faire un Release() ou autre sur un "smart pointer" qui est NULL;
    ce qui semblerait suggerer que,dans ton cas , l'initialisation du pointeur après CoCreate ou QueryInterface ou autre , retourne après un pointeur null en mode propertyeditor .

    peut être qu'en contrôlant les initialisations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HRESULT hr = .....
    if (! (SUCCEEDED(hr)) )
    {    
      //message d'erreur
    }
    tu pourrais trouver d'ou ça vient...

    par ailleurs tu pourrais peut être essayer de reproduire le bug en testant ton composant "en dehors de l'IDE" (contexte de test : composant non installé dans l'IDE /code du composant mis dans un .h et cpp , et une fiche vierge d'une application , ainsi que la fenetre de ton property editor" ...peut être en mettant cette fenetre en modal ou autre ...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Par défaut
    Djob,

    Tout d'abord, merci pour ta réponse.

    Malheureusement, avant mon post, j'avais complètement testé mon composant, qui fonctionne sans aucun problème, que ce soit en le déposant sur une fiche, ou en dérivant une instance de la classe par prog.

    Le probème vient bien de la création de l'instance depuis l'IDE par le propertyeditor.
    J'ai même essayé de ne pas la créer directement depuis le propertyeditor, mais d'exécuter depuis ce dernier une méthode exportée d'une dll chargée dynamiquement, laquelle crée une instance de ma classe. J'obtiens exactement le même résultat.

    Par ailleurs, je suis certain d'obtenir un pointeur IUnknown correct, car des QueryInterface sur des interfaces particulières des serveurs, ainsi que des méthodes de ces interfaces appelées durant l'initialisation de ma Form fonctionnent!!! J'obtiens même des données cohérentes du serveur COM. Tout se bloque après le ASSERT.

    Enfin, tous mes HResults sont déjà tracés dans un log, où je ne vois rien de spécial.

    J'avoue! je cale...

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Par défaut
    Toujours pas de solution ! En revanche si ça peut être utile, j'ai localisé l'origine exacte du déclenchement de l'exception qui se produit lors de la libération de ressources allouées par le serveur (appels de free() sur le pointeur d'allocation général), et donc bien sûr, uniquement en mode design-time.

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Par défaut
    Pour ceux que ça pourrait interresser (apparament, pas grand monde!!) j'ai fini par trouver.
    En mode design, il faut allouer le pointeur d'allocation COM depuis le paquet de conception.

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

Discussions similaires

  1. Chargement de composant COM dans Silverlight
    Par nicosang dans le forum Silverlight
    Réponses: 1
    Dernier message: 19/03/2008, 17h06
  2. Encapsuler un composant com dans une assembly
    Par Arthis dans le forum ASP.NET
    Réponses: 1
    Dernier message: 24/05/2007, 09h59
  3. Utilisation de type Manager dans un composant COM
    Par themadmax dans le forum C++/CLI
    Réponses: 4
    Dernier message: 29/12/2006, 10h02
  4. utilisation du help file dans les composants de la VCL
    Par SOPRA-Eherve dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/09/2006, 22h47
  5. [D2006] - Utiliser un composant C# dans une appli VCL.NET
    Par RamDevTeam dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 13/02/2006, 16h07

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