le serveur COM peut-il réallouer ([in, out] CACLSID * arg)?
-
03-07-2019 - |
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.
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.