Question

Avec une méthode d'interface COM déclarée comme ceci:

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

En ce qui concerne le marshalling, le serveur est-il autorisé à réaffecter le tableau compté? (Je pense que c'est, mais je ne suis plus sûr)

Son implémentation actuelle ne remplace que les identifiants existants, mais j'aimerais implémenter une modification (qui ne résoudrait pas le contrat) qui pourrait renvoyer plus d'éléments sans introduire une nouvelle interface.

[modifier] veuillez noter que CACLSID est déjà un tableau contenant un nombre et un pointeur.

Était-ce utile?

La solution

Je n’ai pas fait de COM depuis très longtemps, mais est-il possible d’allouer un nouveau tableau? Dans ce cas, il ne devrait pas s'agir d'éléments CACLSID ** ?

Autres conseils

Vous devriez donner le compte comme second paramètre qui indique l'espace pour autant d'éléments, en utilisant cette bibliothèque COM, les éléments sont organisés

Tout d'abord, si vous souhaitez que Foo accepte un tableau in, vous devez ajouter un paramètre indiquant le nombre, par exemple:

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

Attention: ce code n'a pas été compilé, il s'agit simplement de sortir de la documentation.

Deuxièmement, vous ne pouvez pas modifier le comportement externe de cette méthode sans changer sa déclaration. Pour prendre en charge le redimensionnement, vous devez être en mesure de réaffecter le tableau et de lui renvoyer son adresse. Vous pouvez utiliser un SAFEARRAY ou déclarer des cItems et des éléments comme pointeurs vers le type initial Foo , par exemple:

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

Encore une fois, non compilé, vous devrez donc savoir ce que vous faites si vous utilisez ceci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top