2009-11-16 23 views
2

Je travaille sur un ensemble de plugins qui sont essentiellement des serveurs COM. Chaque plugin a un ensemble de données de configuration qui est géré par un autre composant, la clé primaire des données de configuration est le ProgID du plug-in. Lorsque le plugin doit accéder à un élément de configuration, il passe un appel et transmet son ProgID ainsi que le nom de la propriété requise. C'est une conception héritée et je dois maintenir la rétrocompatibilité.Est-ce que plusieurs ProgID peuvent pointer vers le même ClsID?

J'ai maintenant besoin de charger plusieurs instances de chaque plugin, chaque instance ayant un ensemble différent de données de configuration. La solution que je considère est de créer plusieurs ProgID uniques pour chaque plugin, chaque ProgID pointerait vers le seul ClsId pour le plugin. Ainsi, chaque instance du plugin serait identifiée par son ProgID, le ProgID est toujours utilisé comme clé primaire pour les données de configuration et tout est rétrocompatible à 100%.

Ainsi, les questions suivantes:

  1. Est-ce une technique acceptable? (plusieurs ProgIDs pointant tous vers un seul ClsID).
  2. Quand mon plugin se chargera, pourra-t-il savoir quel ProgID a été utilisé pour le créer?

Répondre

4

ids Prog sont généralement utilisés de deux manières: pour détecter une (fonction CLSIDFromProgID()) id classe correspondant à un ID de prog - ceci est utilisé pour appeler plus tard CoCreateInstance() - et pour détecter un ID de prog pour une Identificateur de classe donné: il est généralement utilisé pour afficher une version conviviale d'un ID de classe. Ces mappages impliquent qu'il existe une clé HKCR {ProgId} \ CLSID avec une valeur par défaut égale à l'ID de classe et une clé HKCR \ CLSID {classid} \ ProgID avec une valeur par défaut égale à ProgId, ce qui signifie que la cartographie est un-à-un. Vous ne pourrez tout simplement pas avoir plus d'un identifiant prog sous un identifiant de classe.

Un composant COM est chargé en appelant CoCreateInstance() à laquelle est transmis un ID de classe - obtenu par tous les moyens possibles, en utilisant CLSIDFromProgID() inclus. Il n'y a aucun moyen pour un composant de dire comment l'ID de classe a été obtenu.

+0

+1 pour une bonne réponse, cela pourrait bien devenir la réponse acceptée à moins que quelqu'un veuille ajouter quelque chose dans les prochains jours. –