2009-08-04 8 views
3

Je sais que je manque quelque chose de simple, je n'ai presque aucune expérience avec ces choses com.Comment passer bool de C# à travers C++ com interface in idl

Je voudrais le faire dans une interface dans un IDL

[id(5), helpstring("Returns true if the object is in a valid state.")] 
HRESULT IsValid([out, retval] boolean bValid); 

Cependant, cela donne: [out] paramter est pas un pointeur.

Ok, je comprends cela.

Cependant, dans le code C# implémentant cela, je ne peux pas renvoyer un booléen * de la méthode IsValid() car il est dangereux.

Quelle est la manière correcte pour moi de retourner la valeur booléenne?

Répondre

7

Essayez:

HRESULT IsValid([out, retval] VARIANT_BOOL *bValid); 

Pour travailler comme une sortie, il doit être un pointeur sur la valeur; c'est la façon dont il sera écrit du côté du C:

*bValue = VARIANT_TRUE; 

Je ne sais pas si vous pouvez écrire le type que boolean - je ne l'ai jamais vu VARIANT_BOOL utilisé.

Du côté C#, il deviendra équivalent à:

public bool IsValid() 

En d'autres termes, le moteur d'exécution callable wrapper (RCW) mettra en œuvre une version « plus belle » de la signature de la méthode et de prendre soin du danger traduction pour vous. Si l'implémentation C++ renvoie E_FAIL (ou E_WHATEVER), la méthode RCW lancera un ComException.

Vous pouvez également ajouter l'attribut [propget], ce qui rendra IsValid disponible en tant que propriété au lieu d'une méthode. Comme avec n'importe quelle propriété, ne le faites que s'il est bon marché à évaluer et n'a pas d'effets secondaires (le débogueur l'évaluera en passant par le code C#).

+0

cela a fonctionné. aussi, je me demandais comment utiliser une propriété pour cela, donc vous avez résolu deux de mes problèmes. merci! – Erix

Questions connexes