2013-02-19 1 views
-1

J'ai hérité d'un projet qui inclut une DLL COM. Je suis un peu nouveau à COM mais quelque chose ne me semble pas correct. L'interface définie dans l'IDL utilise uniquement le type VARIANT pour toutes les propriétés et les retours/paramètres de méthode. Y a-t-il une justification possible à cela? J'ai le sentiment que le développeur précédent était en train d'aileronner des choses, mais je veux être sûr.L'utilisation exclusive de VARIANT dans une interface COM

Voici ce que mon IDL ressemble:

interface IMyComInterface : IDispatch 
{ 
    [id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg); 
    [id(2), helpstring("method CheckFolder")] HRESULT CheckFolder([in] VARIANT Folder, [out] VARIANT *pCount, [out, retval] VARIANT *pErrorCount); 
    [propget, id(3), helpstring("property Flags")] HRESULT Flags([out, retval] VARIANT *pVal); 
    [propput, id(3), helpstring("property Flags")] HRESULT Flags([in] VARIANT newVal); 
    [propget, id(4), helpstring("property MessageStore")] HRESULT MessageStore([out, retval] VARIANT *pVal); 
    [propput, id(4), helpstring("property MessageStore")] HRESULT MessageStore([in] VARIANT newVal); 
    [propget, id(5), helpstring("property Directory")] HRESULT Directory([out, retval] VARIANT *pVal); 
    [propput, id(5), helpstring("property Directory")] HRESULT Directory([in] VARIANT newVal); 
    [propget, id(6), helpstring("property MessageCount")] HRESULT MessageCount([out, retval] VARIANT *pVal); 
}; 

Remercie beaucoup.

EDIT:

Pour rendre les choses claires, toutes ces VARIANT s pourraient être remplacés par des types explicites.

+0

On dirait que vous avez hérité de mon projet. désolé: p donc VARIANT sont des types génériques qui peuvent être n'importe quoi. Ils sont comme Object dans C#. L'idée est que ces types peuvent changer à l'exécution. Ceci afin que votre interface puisse être compatible avec les langages de liaison de type à l'exécution (tels que VB, C#, etc.). – thang

+0

Bien, vérifiez d'abord la gestion des erreurs dans le code. Nice s'il génère un message d'erreur amical à travers IErrorInfo. Si vous laissez à la mise en œuvre du stock IDispatch alors le DISP_E_BADVARTYPE, "Type de variable incorrect" que vous obtiendriez quand une variable du type incorrect est passé n'est pas le plus grand. Obtenez une meilleure réponse en décrivant le langage de script le plus couramment utilisé avec ce serveur. –

+0

Seule une application C++ utilise ce serveur COM. –

Répondre

0

Pour certains types d'interfaces doubles qui supposent fonctionner avec VB et les langages de script, il est préférable d'utiliser VARIANT ce type direct. Par exemple, il est préférable d'utiliser VARIANT sur presque tous les types de pointeurs d'interface et SAFEARRAY. Mais vous pouvez tester et voir.

1

Si vous avez besoin de performances ou de simplification, vous devez modifier le type VARIANT pour les valeurs appropriées, plus près du type utilisé. Rappelez-vous, c'est une rupture d'interface.
Voir les valeurs valides à utiliser:
COM Data Types

1

Votre dérive de l'interface IDispatch qui signifie qu'il est une double interface - vous pouvez appeler les méthodes directement à partir de l'interface, ou vous pouvez les appeler par iDispatch::Invoke. Les paramètres transmis à Invoke doivent tous être de type VARIANTARG qui est juste un autre nom pour VARIANT, voir http://msdn.microsoft.com/en-us/library/ms891678.aspx.

+0

Donc, pour avoir la capacité d'être une double interface, tous les paramètres de l'interface doivent être de type 'VARIANT'? 'Invoke' ne gère pas le marshaling de' VARIANT' aux types décrits dans l'interface? –

+0

IDispatch :: Invoke() est supposé faire tout le marshaling. – Luke

Questions connexes