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 :

Support de l'interface ICategorizeProperties dans composant ActiveX


Sujet :

API, COM et SDKs Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Support de l'interface ICategorizeProperties dans composant ActiveX
    Bonjour à tous,

    J'ai crée un composant ActiveX qui contient beaucoup de propriétés.
    Ce composant est utilisé dans une application avec VBA.

    J'aimerais faire des catégories de propriétés pour simplifier l'utilisation du composant.
    Pour cela je dois implémenter l'interface ICategorizeProperties (http://msdn.microsoft.com/en-us/libr...roperties.aspx) qui n'est pas connue d'origine sous Delphi.

    J'ai essayé de l'ajouter avec ses deux méthodes, mais je n'arrive pas à faire fonctionner correctement.
    Après le premier appel de GetCategoryName, cela reviens dans la méthode mais les paramètres ne sont plus valides et l'application hôte crash.
    Je crois qu'il faut faire une boucle en récupérant la liste des propriétés avant de quitter la méthode GetCategoryName mais je ne sais pas comment le faire.

    Est-ce que quelqu'un pourrait m'aiguiller sur ce problème ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    ICategorizeProperties c'est pour l'interaction de d'un Package avec son IDE Visual Studio !

    Est-ce qu'un ActiveX COM peut avoir cela !
    Est-ce qu'un VsPackage et un ActiveX sont compatibles ?
    Déjà, il est clair qu'il te faut Visual Studio d'installer pour que Delphi trouve les TLB, tu peux ainsi les ajouter comme dépendance au mettre titre que StdOle2...

    Fait gaffe a utiliser des WideString et d'en conserver le contenu dans ton objet !
    En C++Builder, j'avais déclarer un WideString en variable locale passer à un B_STR, même si on pouvait s'en sortir sans crash,
    j'ai constaté que plusieurs chaines partageaient le même espace mémoire géré par Windows pour les B_STR car côté appelant, le B_STR était utilisé directement sans WideString donc sans compteur et tout ce qui va avec !
    En Delphi, si tu utilise bien WideString, cela fonctionne correctement
    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. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    ICategorizeProperties est aussi utilisé pour l'interaction d'un contrôle ActiveX avec l'IDE du VBA.

    Cette interface est bien "appelée" par le container qui utilise mon contrôle (je reçois le queryinterface).

    Je n'utilises pas les TLB, j'ai fait la déclaration complète de l'interface directement dans mon unité (peut-être que mon erreur est là, mais je ne vois pas pourquoi l'utilisation du TLB est nécessaire..).
    Ma déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type ICategorizeProperties = interface(IUnknown)
        ['{4D07FC10-F931-11CE-B001-00AA006884E5}']
        function GetCategoryName(PROPCAT: Int32;lcidCategory : UInt32; out pbstrName: WideString): HResult; stdcall;
        function MapPropertyToCategory(dispid: Int32; out ppropcat: PInt32): HRESULT; stdcall;
      end;
    Mon unité est une version modifiée de "Vcl.AxCtrls" pour permettre la création d'un composant WindowLess (aucun Handle de fenêtre, etc...).

    J'ai bien utilisé des WideString justement, mais comme ça ne fonctionnait pas, j'ai essayé plusieurs types différents mais aucun résultat concluants....
    Le widestring est une sortie de la fonction (j'ai essayé var et out, même résultat).

    J'ai sûrement un problème avec le pointage de ce WideString qui correspond à un BSTR* mais je n'arrive pas à voir (comprendre) d'où vient ce pointage.

    Par contre ton idée d'installer Visual Studio pour avoir un TLB peut peut-être m'aider à confirmer la bonne déclaration.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par mattfr69 Voir le message
    Je n'utilises pas les TLB, j'ai fait la déclaration complète de l'interface directement dans mon unité (peut-être que mon erreur est là, mais je ne vois pas pourquoi l'utilisation du TLB est nécessaire..).
    Lorsque je fais un ActiveX, je déclare toute mes interfaces et les implémentations dans le TLB via l'outil fourni
    VBA doit en plus fonctionner le LateBinding ce qui doit avoir besoin justement des déclarations de type fourni par la TLB
    C'est le fonctionnement pour SES propres interfaces !

    Mais comme ton interface est un standard de Microsoft, il y a forcément une TLB qui décrit ICategorizeProperties dans le System
    J'avoue que je n'ai jamais tenté et je n'ai pas la réponse !

    Ne pas confondre la déclaration Delphi de ICategorizeProperties et sa déclaration COM contenu dans une TLB du system qui fourni les DispID et tout le tralala COM nécessaire au LateBinding

    Citation Envoyé par mattfr69 Voir le message
    Par contre ton idée d'installer Visual Studio pour avoir un TLB peut peut-être m'aider à confirmer la bonne déclaration.
    Si le VBA l'utilise, c'est surement cet outil qui contient la déclaration !
    J'écrivais mes VBS sous Notepad, je n'ai jamais fait de VBA dans Excel ou autre !

    Mes VBS était souvent fourni comme exemple de coder de mes objets COM (qui encapsulait des DLL Win32 pour les boulets ne sachant pas les utiliser)
    Ainsi je faisais en sorte d'utiliser des passages de paramètres soit compris par le VBS, il y avait ainsi de bonne chance qu'un autre langage supporte mes objets correctement (j'ai eu des dev C# ou VB.NET qui avait du mal à comprendre la différence entre une DLL Win32 et une DLL contenant un COM et qui comprenait que ma DLL Win32 n'était pas une Assembly)

    Enfin, je vois du PInt32 ? MapPropertyToCategory renvoie un pointeur ?
    J'ai toujours un doute sur ce genre de pointer

    je dirais que "PROPCAT* ppropcat" en C++ c'est "out ppropcat: Int32" en delphi
    je dirais que "PROPCAT** ppropcat" en C++ c'est "out ppropcat: PInt32" en delphi

    le in et out du C++ idl ne sont que indicatif, dans le C++, out ça n'existe pas, c'est toujours du pointeur !
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HRESULT ICategorizeProperties::MapPropertyToCategory(
       [in] DISPID dispid, 
       [out] PROPCAT* ppropcat
    );

    Idée bien moche !!!
    Déclare tes WideString en global pour chaque catégorie, tu peux faire un tableau si veux
    et tu renvoie le contenu de la globale par simple affectation dans pbstrName

    C'est juste au cas ou l'appelant ne prend pas la peine d'incrémenter le compteur de référence d'une OleStr (voir SysAllocString) et si ton WideString est locale à la fonction, une fois la fonction fini, tu décrémente et Windows considère que l'emplacement mémoire est libre !

    autre remarque !
    En Delphi, tu peux aussi utiliser le SafeCall dans certains cas, cela simplifie les out et rend implicite le HResult

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type ICategorizeProperties = interface(IUnknown)
        ['{4D07FC10-F931-11CE-B001-00AA006884E5}']
        function GetCategoryName(PROPCAT: Int32;lcidCategory : UInt32): WideString; safecall;
        function MapPropertyToCategory(dispid: Int32): Int32; safecall;
      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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour tes réponses, concernant les pointeurs, j'ai toujours des doutes avec les correspondances entre C++ et Delphi mais j'ai essayé beaucoup de possibilités et je n'ai pas réussi.

    Sinon, je dois expliquer un peu mon contrôle ActiveX, c'est un contrôle WindowLess donc sans aucun Handle de fenêtre et je n'ai pas trouvé d'autre moyen sous Delphi que de récréer la classe TActiveXControl (Vcl.AxCtrl) en ajoutant l'interface IOleInPlaceObjectWindowless.

    Concernant les TLB, je ne suis pas vraiment expert en objets COM mais je ne vois pas trop pour quelle raison j'aurais besoin d'un TLB vu que c'est une interface que mon contrôle doit renvoyer lui-même quand il reçoit une requête de la part du container via la function ObjQueryInterface.
    Cette fonction renvoies seulement l'interface demandée de mon propre objet et donc le container utilise alors le latebinding pour accéder aux méthodes de l'interface demandée (dans mon cas le GetCategoryName).
    Est-ce que je me trompes ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/07/2007, 17h02
  2. Handle feuille dans composant ActiveX
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 03/05/2007, 18h26
  3. [Débutant]Intégration composant dans un ActiveX Control
    Par Mandalore dans le forum Visual C++
    Réponses: 9
    Dernier message: 19/03/2007, 10h28
  4. Composant ActiveX (VB) utilisable dans VC++
    Par Micromalice dans le forum Visual C++
    Réponses: 1
    Dernier message: 25/08/2006, 10h13
  5. [COM] Interface refusée dans un activeX
    Par Nalfouille dans le forum MFC
    Réponses: 1
    Dernier message: 27/03/2006, 13h58

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