Я хочу передать объекты JavaScript (объекты JSON и функции) в свой элемент управления ActiveX.В идеале я мог бы манипулировать объектами JavaScript (например, читать или изменять JSON) и выполнять вызовы функций JavaScript из элемента управления ActiveX (используя C ++).Возможно ли что-нибудь из этого, или я должен согласиться на передачу строк?
Например, вот что я могу сделать в Firefox.Обратите внимание, что у меня есть ссылка на объект JSON, и я также могу выполнять вызовы функций JavaScript:
NPString jsonToString(NPP instance, NPObject* json)
{
NPVariant result;
NPVariant arg;
NPIdentifier identifier;
/* Get the global object */
NPObject* windowObj = NULL;
g_NPNFuncs.getvalue(instance, NPNVWindowNPObject, &windowObj);
/* Get JSON object */
identifier = g_NPNFuncs.getstringidentifier("JSON");
g_NPNFuncs.getproperty(instance, windowObj, identifier, &result);
NPObject* jsonObj = NPVARIANT_TO_OBJECT(result);
/* Call stringify */
identifier = g_NPNFuncs.getstringidentifier("stringify");
OBJECT_TO_NPVARIANT(json, arg);
g_NPNFuncs.invoke(instance, jsonObj, identifier, &arg, 1, &result);
return NPVARIANT_TO_STRING(result);
}
Редактировать - Вот решение, которое япридумали:
файл IDL:
[id(TEST_ID)] BSTR Test(BSTR data, IDispatch* function);
Карта отправки:
DISP_FUNCTION_ID(CApp, "test", TEST_ID, Test, VT_BSTR, VTS_BSTR VTS_DISPATCH)
Функция интерфейса:
BSTR Test(BSTR data, IDispatch* function)
Вызов объекта функции JavaScript:
VARIANTARG args[1];
args[0].vt = VT_BSTR;
args[0].bstrVal = _bstr_t(dataStr).GetBSTR();
DISPPARAMS params;
params.cArgs = 1;
params.cNamedArgs = 0;
params.rgvarg = args;
HRESULT hresult = function->Invoke(0, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
Вызов IDispatch :: Invoke с DISPID 0, похоже, работает для вызова объекта функции.Однако, чтобы вызвать метод объекта, вы должны сначала получить соответствующий DISPID, как сказал Таксилиан.GetNextDispID должен работать для этого (первый QueryInterface для IDispatchEx; приведение к IDispatchEx, кажется, тоже работает, но, возможно, небезопасно).