将对象从Javascript传递到C++; 我找到了解决方案,但我还有一个任务:从Javascript到< C++ >强>对象(如果我使用IDispatch的iWebBuffSer2)< /P> 我的意思是,我需要通过JavaScript对象参数< /p>通过Wield.Exalal.Frand调用C++方法。 var obj = {name: "Petr", group: "Friend"}; window.external.myMethod(obj);

将对象从Javascript传递到C++; 我找到了解决方案,但我还有一个任务:从Javascript到< C++ >强>对象(如果我使用IDispatch的iWebBuffSer2)< /P> 我的意思是,我需要通过JavaScript对象参数< /p>通过Wield.Exalal.Frand调用C++方法。 var obj = {name: "Petr", group: "Friend"}; window.external.myMethod(obj);,javascript,c++,iwebbrowser2,Javascript,C++,Iwebbrowser2,如何访问对象成员“name”、“group”等?如果您只需要能够读取对象字段,最灵活的方法是使用JSON 在网页侧使用: var obj={name:“Petr”,group:“Friend”}; window.external.myMethod(JSON.stringify(obj)) 在C++侧定义MyMultMeod()以接受单个字符串参数。然后使用将此参数解析为可读对象。您可以通过接口及其方法和访问对象的属性 根据您对代码< MyMeals的定义,您应该在C++代码中接收 Obj>代码>

如何访问对象成员“name”、“group”等?

如果您只需要能够读取对象字段,最灵活的方法是使用JSON

在网页侧使用:

var obj={name:“Petr”,group:“Friend”}; window.external.myMethod(JSON.stringify(obj))


<>在C++侧定义MyMultMeod()以接受单个字符串参数。然后使用将此参数解析为可读对象。

您可以通过接口及其方法和访问对象的属性

根据您对代码< MyMeals<代码>的定义,您应该在C++代码中接收<代码> Obj>代码>作为代码或>代码> IDISPATTU/<代码>。如果一个

变量
vt
应该是
vt_dispatch
,在这种情况下,您可以安全地解除对
pdispval的引用

一旦有了
IDispatch
指针,就可以使用
GetIDsOfNames
获取感兴趣的属性的

_bstr_t sPropertyName = L"myProperty";
DISPID dispid = 0;
HRESULT hr = pDispatch->GetIDsOfNames(IID_NULL, &sPropertyName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
    ...
成功接收到
DISPID
后,必须根据是否要获取值、设置值或调用方法以不同方式调用
Invoke

例如,要获取值,请执行以下操作:

    VARIANT vValue;
    hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, 0, &vValue, 0, 0);
    if(SUCCEEDED(hr))
    {
        ...
有关调用时不同排列的更多信息,请参阅
Invoke
文档

static HRESULT \
IDispatch_VarGet (IDispatch *pRDisp, LPOLESTR Name, VARIANT *pVarRes)
{
    DISPPARAMS DispParams;
    DISPID dispid;
    HRESULT hr;

    if ((hr = IDispatch_GetIDsOfNames (pRDisp, &IID_NULL,
                &Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
        return hr;

    ZeroMemory (&DispParams, sizeof (DispParams));

    hr = IDispatch_Invoke (pRDisp, dispid, &IID_NULL,
            LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,
            &DispParams, pVarRes, NULL, NULL);

    return hr;
}


static HRESULT \
IDispatch_VarPut (IDispatch *pRDisp, LPOLESTR Name, VARIANT *pVarArg)
{
    DISPPARAMS DispParams;
    DISPID dispid, ndispid;
    HRESULT hr;

    if ((hr = IDispatch_GetIDsOfNames (pRDisp, &IID_NULL,
                &Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
        return hr;

    ndispid = DISPID_PROPERTYPUT;

    DispParams.rgvarg = pVarArg;
    DispParams.rgdispidNamedArgs = &ndispid;
    DispParams.cArgs  = 1;
    DispParams.cNamedArgs = 1;

    hr = IDispatch_Invoke (pRDisp, dispid, &IID_NULL,
            LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT,
            &DispParams, NULL, NULL, NULL);

    return hr;
}


static HRESULT \
IDispatch_StrPut (IDispatch *pRDisp, LPOLESTR Name, LPOLESTR StrVal)
{
    VARIANT varg;
    HRESULT hr;

    VariantInit (&varg);

    V_VT   (&varg) = VT_BSTR;
    V_BSTR (&varg) = SysAllocString (StrVal);

    hr = IDispatch_VarPut (pRDisp, Name, &varg);

    VariantClear (&varg);

    return hr;
}


static HRESULT \
IDispatch_IntPut (IDispatch *pRDisp, LPOLESTR Name, int IntVal)
{
    VARIANT varg;
    HRESULT hr;

    VariantInit (&varg);

    V_VT (&varg) = VT_I4;
    V_I4 (&varg) = IntVal;

    hr = IDispatch_VarPut (pRDisp, Name, &varg);

    VariantClear (&varg);

    return hr;
}

和jave代码示例

var frec = {code:'', state:0};

frec.code = row.cells[0].innerHTML;
external.FeatureStateChg (frec);
_featState (row.cells[2], frec.state);


我现在知道并正在做这件事,但我认为这可能与上面文章中的链接相同,但我不是COM中的高级用户:((上面的文章是在ExpertsExchange中。我认为把它们链接起来不是一个好主意,所以…我没有在ExpertsExchange注册。好的,那么,给定的问题呢?既然有人帮了你,那么回顾一下你的问题怎么样?;我已经做了:)在你的笔记之后,马上有一个问题非常好,只有一个问题-我们如何枚举对象的所有成员?我尝试使用pDispatch->GetTypeInfo=>itTypeInfo::GetNames-但有点错误:(一些解释也很感谢。)
{
    // ...
    VariantInit (&varg);

    if ((hr = IDispatch_VarGet (pRDisp, L"code", &varg)))
    {
        VariantClear (&varg);
        return hr;
    }

    if (V_VT (&varg) == VT_BSTR)

    // ...

    VariantClear (&varg);
    return hr;
}
var frec = {code:'', state:0};

frec.code = row.cells[0].innerHTML;
external.FeatureStateChg (frec);
_featState (row.cells[2], frec.state);
var frec = {code:'', name:'', state:0};

if (!external.FeaturesEnum (frec, i))
    break;