2015-03-06 5 views
1

Deux questions fichiers IDL COM simple que je ne peux pas sembler trouver des réponses pour, même avec la recherche MSDN et Internet général:Deux questions simples de syntaxe COM IDL: existe-t-il un moyen de spécifier le modèle de thread, et ai-je besoin de void pour dire "no arguments"?

  1. Y at-il un attribut d'interface qui me permet de spécifier mon interface doit être mis en œuvre par Objets STA uniquement, ou s'agit-il d'un détail pour ma documentation uniquement? J'ai déjà [object, local] que je pense est correct pour les objets COM non-remoting (in-process).

  2. Ai-je besoin de void entre les parenthèses de mes déclarations de méthode (comme en C) pour ne spécifier aucun argument? MSDN est incohérent à ce sujet; Les fichiers d'en-tête Mes propres implémentations personnelles de cette interface seront en C.

Merci.

+1

COM est plein de choses sous-spécifiées qui ont fini comme elles sont à cause de comment la pratique commune est tombée dans les premiers jours de COM ... Je ne vois aucun mal à utiliser «void», et je ne vois pas ce que attribut d'interface permettrait d'atteindre. (Si quelqu'un d'autre veut implémenter votre interface bien pour eux). Les modèles de threads pris en charge sont une propriété de la classe, pas une interface particulière. –

+0

Ah, "propriété de la classe" a du sens alors. Merci pour les deux réponses! – andlabs

Répondre

1

Vous parlez du modèle de thread que vous souhaitez spécifier pour votre composant COM. Non, vous ne pouvez pas mettre ça dans l'IDL, c'est trop important. Un client n'a pas à utiliser votre IDL, un langage de script tel que Javascript ne le sera jamais par exemple. Il doit aller dans le registre, dans la clé CLSID de votre composant. Vous voulez ThreadingModel = "Apartment" pour demander au client de fournir un thread STA. S'il est manquant alors COM suppose que par défaut.

Gardez à l'esprit que ceci ne pas forcer le programmeur client à en fournir un. S'il préfère le MTA pour une raison quelconque, alors COM fournira le thread STA pour donner à votre composant la sécurité de la maison. Si votre proxy le rend trop lent pour être utilisable, vous avez une exigence de documentation.

Non HRESULT Method(void) dans l'IDL n'est pas nécessaire, en utilisant HRESULT Method() est suffisant. Midl.exe se fiche de la langue que vous utilisez.

+0

Je vois aussi bien; Merci. – andlabs

+0

Dans la configuration que j'utilise, le modèle de thread est spécifié dans l'un des fichiers .cpp (en fait, le paramètre constructeur de la base de type ATL) et le code d'auto-enregistrement s'y réfère. Je suppose que MSVC fait quelque chose de similaire. –