2010-12-16 5 views
0

Nous avons un vieux composant similaire à COM avec un ensemble d'interfaces plutôt complexes. Ces interfaces sont assez problématiques pour marshal, donc nous n'enregistrons rien dans le registre mais exportons à la place une fonction CreateMainObject() depuis le composant DLL qui récupère un pointeur IMainObject et l'interface IMainObject a un énorme ensemble d'autres fonctions.Comment utiliser les objets COM via des pointeurs "raw" appelés?

De cette façon, le client appelle jamais CoCreateInstance() - au lieu qu'il appelle LoadLibraryEx()/GetProcAddress() et appelle ensuite la fonction CreateMainObject(). Aucun marshalling ne peut jamais être fait puisque COM n'entre pas réellement dans la scène - toutes les actions sont exécutées en appelant directement des méthodes sur ces objets. Tout est très rapide mais bien sûr pas thread-safe et ne fonctionne pas dans un substitut COM +.

Existe-t-il un terme pour une telle utilisation des interfaces COM?

Répondre

1

Le terme recherché est "incorrect", comme dans "Ceci est un incorrect utilisation d'interfaces COM".

Pourquoi ne pas vous inscrire ICreateMainObject dérivé de IUnknown (ou IDispatch si vous préférez) avec une méthode, ICreateMainObject::CreateMainObject, utilisez cette méthode pour instancier votre objet en utilisant la sémantique COM valides.

+0

C'est un peu dur, n'est-ce pas? Je ne pense pas qu'il y ait quelque chose dans la spécification COM qui dit que vous devez utiliser le registre COM. Il ne décrit pas non plus ce qui implique une violation de la sémantique COM, pour autant que je puisse le voir. –

+0

@Chris Dickson: Premièrement, si le client utilise des points d'entrée DLL, pourquoi ne pas aller jusqu'au bout et créer une paire .h/.lib et utiliser la DLL comme une bibliothèque dynamique, pourquoi ajouter une surcharge COM? Deuxièmement, comment les autres clients sont-ils supposés utiliser la classe, comme .Net interrop? Et enfin: où est l'infrastructure COM mise en place? Qui appelle CoInitializeEx et CoInitializeSecurity dans ce modèle? L'objet est-il un STA ou un MTA? Les interfaces doivent-elles être marshalées entre les threads ou non? Comment les nouvelles versions de IMainObject sont-elles découvertes lors de l'exécution? Cet arrangement fonctionne-t-il avec SxS? –

+0

@Chris Dickson: pour ne pas mentionner que COM et l'activation sans enregistrement correct existe déjà: http://msdn.microsoft.com/en-us/library/ms973913.aspx –

Questions connexes