2009-03-02 7 views
0

Avec une méthode d'interface COM déclarée comme ceci:peut serveur COM réallouer ([in, out] CACLSID * arg)?

[ object, 
    uuid(....), 
] 
interface IFoo : IUnknown 
{ 
    HRESULT Foo([in, out] CACLSID * items); 
} 

En ce qui concerne marshalling, le serveur est autorisé à réattribuer le tableau compté? Son implémentation actuelle ne remplace que les identifiants existants, mais je voudrais implémenter une modification (qui ne casserait pas le contrat) qui pourrait retourner plus d'éléments sans introduire une nouvelle interface.

[edit] Veuillez noter que CACLSID est déjà un tableau, contenant un nombre et un pointeur.

Répondre

1

Je n'ai pas fait COM depuis très longtemps mais est-il même possible d'allouer un nouveau tableau? Dans ce cas, ne devrait-il pas être CACLSID ** items?

+0

Oui, CACLSID = struct {unsigned long cElems; CLSID * pElems; } où pElems est alloué en utilisant CoAlloc. Donc, pas exactement "allouer un nouveau tableau", mais "redimensionner le tableau existant - ce qui est probablement la raison pour laquelle je ne suis pas sûr." } – peterchen

+0

Je suis sûr que vous n'êtes pas autorisé à le redimensionner lorsque votre IDL ressemble à ce qu'il est. pour utiliser ce que l'on appelle des tableaux ouverts si vous avez besoin de redimensionner quelque chose comme: HRESULT Foo ([en] long cMax, [in, out] longtemps * pcActual, [in, out, size_is (cMax), length_is (* pcActual)] CLSID * pElemn) –

+0

Comme je l'ai dit je n'ai pas programmé COM depuis longtemps mais j'ai ouvert mon "COM Essentiel" par Don Box et je l'ai trouvé :-) –

0

Vous devez donner le comte comme second paramètre qui indique l'espace pour tant de nombre d'éléments, en utilisant cette maréchaux bibliothèque COM éléments

0

d'abord, si vous voulez Foo accepter un dans le tableau, vous devez ajouter un paramter qui donne le nombre, par exemple:

HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items); 

Attention: ce code n'a pas été compilé, juste aller de la documentation. En second lieu, vous ne pouvez pas modifier le comportement externe de cette méthode sans modifier sa déclaration. Pour prendre en charge le redimensionnement, vous devez pouvoir réaffecter le tableau et renvoyer son adresse. Vous pouvez utiliser un SAFEARRAY ou déclarer cItems et items comme des pointeurs du type d'origine Foo prend, .: par exemple

HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items); 

Encore une fois, pas compilé, de sorte que vous aurez fait savoir ce que vous faites si vous utilisez ce.

Questions connexes