Je crée une application scriptable en utilisant l'API native windows et le moteur JavaScript chakrart. J'ai des interfaces comme suit dans mon IDL:Propriétés indexées basées sur Chakra et IDispatch
[oleautomation, dual, nonextensible,
uuid(...)]
interface IMyInterface : IDispatch
{
[id(MYDISPID_EVENT), propget] HRESULT Event(BSTR strEventName, [out, retval] IDispatch ** ppHandler);
[id(MYDISPID_EVENT), propput] HRESULT Event(BSTR strEventName, IDispatch * pHandler);
};
Je suis en mesure d'ajouter les objets natifs au moteur chakrart sans problème (en utilisant JsVariantToValue puis définir une propriété sur l'objet global du contexte actuel). Toutefois, lorsque je tente de définir un gestionnaire d'événements, le message d'exception "Objet ne prend pas en charge cette propriété ou cette méthode" s'affiche.
J'ai essayé les variations de syntaxe suivantes:
object.Event["foo"] = handler;
object.Event("foo", handler);
object.put_Event("foo", handler);
object.Event("foo") = handler;
Ce dernier est proche de la façon dont cela se fait à l'aide vbscript:
object.Event("foo") = GetRef("handler)
Si j'utilise la syntaxe de méthode dans le IDL comme ce qui suit cela fonctionne, je préférerais simplement utiliser l'assignation de propriété si possible.
[id(MYDISPID_GETEVENT)] HRESULT GetEvent(BSTR strEventName, [out, retval] IDispatch ** ppHandler);
[id(MYDISPID_SETEVENT)] HRESULT SetEvent(BSTR strEventName, IDispatch * pHandler);
Et notez aussi que les affectations de propriétés simples fonctionnent, il est seulement quand j'essaie propriétés indexées qu'il casse. Je comprends que JavaScript fait quelque chose de très différent avec la syntaxe object [prop], au moins pour les objets JavaScript natifs. Est-ce simplement une incompatibilité dans la couche d'interopérabilité de chakrart?
Donc, je n'ai pas de réponse pour vous, mais je suis sur le point d'essayer de faire quelque chose de similaire et je suis curieux de savoir exactement comment vous avez enregistré votre objet natif? Avez-vous créé un VARIANT de type VT_DISPATCH contenant le pointeur IDispatch de votre objet, passez-le à JsVariantToValue, puis enregistrez cette valeur en tant que propriété sur l'objet global? –
C'est exactement ce que j'ai fait. Cela signifie également que je suis coincé en utilisant ChakraRT plutôt que d'être en mesure d'utiliser ChakraCore, ChakraCore est les parties portables du moteur mais IDispatch n'est pas, donc ... J'ai aussi écrit une fonction qui prend les pointeurs et les registres IDispatch et ITypeInfo tous les membres dispatchables en tant que propriétés du global. Cela est dû au fait que l'exécution de JavaScript à l'exécution n'a rien de tel que l'indicateur SCRIPTITEM_GLOBALMEMBERS d'IActiveScript :: AddNamedItem s. Et désolé pour la suppression de ma réponse à plusieurs reprises, je suis aveugle et la boîte d'édition se comporte mal avec mon lecteur d'écran. – SoronelHaetir