本文整理汇总了C++中IDispatch_Invoke函数的典型用法代码示例。如果您正苦于以下问题:C++ IDispatch_Invoke函数的具体用法?C++ IDispatch_Invoke怎么用?C++ IDispatch_Invoke使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IDispatch_Invoke函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: ClDispatch_Invoke
static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
DocHost *This = impl_from_IDispatch(iface);
TRACE("(%p)->(%s %s %d %04x %p %p %p %p)\n", This, debugstr_dispid(dispIdMember),
debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
switch(dispIdMember) {
case DISPID_AMBIENT_USERMODE:
case DISPID_AMBIENT_DLCONTROL:
case DISPID_AMBIENT_USERAGENT:
case DISPID_AMBIENT_PALETTE:
if(!This->client_disp)
return E_FAIL;
return IDispatch_Invoke(This->client_disp, dispIdMember, riid, lcid, wFlags,
pDispParams, pVarResult, pExcepInfo, puArgErr);
case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
V_VT(pVarResult) = VT_BOOL;
V_BOOL(pVarResult) = This->offline;
return S_OK;
case DISPID_AMBIENT_SILENT:
V_VT(pVarResult) = VT_BOOL;
V_BOOL(pVarResult) = This->offline;
return S_OK;
}
FIXME("unhandled dispid %d\n", dispIdMember);
return E_NOTIMPL;
}
开发者ID:Sunmonds,项目名称:wine,代码行数:31,代码来源:client.c
示例2: update_readystate
static void update_readystate(PluginHost *host)
{
DISPPARAMS params = {NULL,NULL,0,0};
IDispatchEx *dispex;
IDispatch *disp;
ULONG err = 0;
VARIANT v;
HRESULT hres;
hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
FIXME("Use IDispatchEx\n");
IDispatchEx_Release(dispex);
}
hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatch, (void**)&disp);
if(FAILED(hres))
return;
hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, &v, NULL, &err);
IDispatch_Release(disp);
if(SUCCEEDED(hres)) {
/* FIXME: make plugin readystate affect document readystate */
TRACE("readystate = %s\n", debugstr_variant(&v));
VariantClear(&v);
}
}
开发者ID:miurahr,项目名称:wine,代码行数:27,代码来源:pluginhost.c
示例3: check_script_safety
static BOOL check_script_safety(PluginHost *host)
{
DISPPARAMS params = {NULL,NULL,0,0};
DWORD policy_size, policy;
struct CONFIRMSAFETY cs;
BYTE *ppolicy;
ULONG err = 0;
VARIANT v;
HRESULT hres;
cs.clsid = host->clsid;
cs.pUnk = host->plugin_unk;
cs.dwFlags = 0;
hres = IInternetHostSecurityManager_QueryCustomPolicy(&host->doc->IInternetHostSecurityManager_iface,
&GUID_CUSTOM_CONFIRMOBJECTSAFETY, &ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
if(FAILED(hres))
return FALSE;
policy = *(DWORD*)ppolicy;
CoTaskMemFree(ppolicy);
if(policy != URLPOLICY_ALLOW)
return FALSE;
V_VT(&v) = VT_EMPTY;
hres = IDispatch_Invoke(host->disp, DISPID_SECURITYCTX, &IID_NULL, 0, DISPATCH_PROPERTYGET, ¶ms, &v, NULL, &err);
if(SUCCEEDED(hres)) {
FIXME("Handle security ctx %s\n", debugstr_variant(&v));
return FALSE;
}
return TRUE;
}
开发者ID:miurahr,项目名称:wine,代码行数:34,代码来源:pluginhost.c
示例4: get_doc_ready_state
static HRESULT get_doc_ready_state(DocHost *This, READYSTATE *ret)
{
DISPPARAMS dp = {NULL,NULL,0,0};
IDispatch *disp;
EXCEPINFO ei;
VARIANT var;
HRESULT hres;
hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp);
if(FAILED(hres))
return hres;
hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,
&dp, &var, &ei, NULL);
IDispatch_Release(disp);
if(FAILED(hres)) {
WARN("Invoke(DISPID_READYSTATE failed: %08x\n", hres);
return hres;
}
if(V_VT(&var) != VT_I4) {
WARN("V_VT(var) = %d\n", V_VT(&var));
VariantClear(&var);
return E_FAIL;
}
*ret = V_I4(&var);
return S_OK;
}
开发者ID:mikekap,项目名称:wine,代码行数:29,代码来源:dochost.c
示例5: call_sink
void call_sink(ConnectionPoint *This, DISPID dispid, DISPPARAMS *dispparams)
{
DWORD i;
for(i=0; i<This->sinks_size; i++) {
if(This->sinks[i])
IDispatch_Invoke(This->sinks[i], dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, dispparams, NULL, NULL, NULL);
}
}
开发者ID:RareHare,项目名称:reactos,代码行数:10,代码来源:events.c
示例6: IMediaPosition_fnInvoke
static HRESULT WINAPI
IMediaPosition_fnInvoke(IMediaPosition* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
CFilterGraph_THIS(iface,mediaposition);
TRACE("(%p)->()\n",This);
return IDispatch_Invoke(
CFilterGraph_IDispatch(This),
DispId,riid,lcid,wFlags,pDispParams,pVarRes,pExcepInfo,puArgErr);
}
开发者ID:NVIDIA,项目名称:winex_lgpl,代码行数:11,代码来源:impos.c
示例7: httprequest_setreadystate
static void httprequest_setreadystate(httprequest *This, READYSTATE state)
{
READYSTATE last = This->state;
This->state = state;
if (This->sink && last != state)
{
DISPPARAMS params;
memset(¶ms, 0, sizeof(params));
IDispatch_Invoke(This->sink, 0, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, 0, 0, 0);
}
}
开发者ID:YokoZar,项目名称:wine,代码行数:14,代码来源:httprequest.c
示例8: call_cp_func
static HRESULT call_cp_func(IDispatch *disp, DISPID dispid, HTMLEventObj *event_obj, VARIANT *retv)
{
DISPPARAMS dp = {NULL,NULL,0,0};
VARIANT event_arg;
ULONG argerr;
EXCEPINFO ei;
if(event_obj) {
V_VT(&event_arg) = VT_DISPATCH;
V_DISPATCH(&event_arg) = (IDispatch*)&event_obj->IHTMLEventObj_iface;
dp.rgvarg = &event_arg;
dp.cArgs = 1;
}
memset(&ei, 0, sizeof(ei));
return IDispatch_Invoke(disp, dispid, &IID_NULL, 0, DISPATCH_METHOD, &dp, retv, &ei, &argerr);
}
开发者ID:PigFlyGames,项目名称:wine,代码行数:17,代码来源:htmlevent.c
示例9: call_cp_func
static HRESULT call_cp_func(IDispatch *disp, DISPID dispid)
{
DISPPARAMS dp = {NULL,NULL,0,0};
ULONG argerr;
EXCEPINFO ei;
VARIANT vres;
HRESULT hres;
V_VT(&vres) = VT_EMPTY;
memset(&ei, 0, sizeof(ei));
hres = IDispatch_Invoke(disp, dispid, &IID_NULL, 0, DISPATCH_METHOD, &dp, &vres, &ei, &argerr);
if(SUCCEEDED(hres) && V_VT(&vres) != VT_EMPTY) {
FIXME("handle result %s\n", debugstr_variant(&vres));
VariantClear(&vres);
}
return hres;
}
开发者ID:mikekap,项目名称:wine,代码行数:18,代码来源:htmlevent.c
示例10: disp_propput
HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DISPPARAMS *dp)
{
IDispatchEx *dispex;
EXCEPINFO ei = {0};
HRESULT hres;
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, NULL, &ei, NULL /* FIXME! */);
IDispatchEx_Release(dispex);
}else {
ULONG err = 0;
TRACE("using IDispatch\n");
hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, NULL, &ei, &err);
}
return hres;
}
开发者ID:Strongc,项目名称:reactos,代码行数:19,代码来源:vbdisp.c
示例11: call_disp_func
static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv)
{
IDispatchEx *dispex;
EXCEPINFO ei;
HRESULT hres;
memset(&ei, 0, sizeof(ei));
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, retv, &ei, NULL);
IDispatchEx_Release(dispex);
}else {
TRACE("Could not get IDispatchEx interface: %08x\n", hres);
hres = IDispatch_Invoke(disp, 0, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD,
dp, retv, &ei, NULL);
}
return hres;
}
开发者ID:PigFlyGames,项目名称:wine,代码行数:20,代码来源:htmlevent.c
示例12: invoke_disp_value
static HRESULT invoke_disp_value(DispatchEx *This, IDispatch *func_disp, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
{
DISPID named_arg = DISPID_THIS;
DISPPARAMS new_dp = {NULL, &named_arg, 0, 1};
IDispatchEx *dispex;
HRESULT hres;
if(dp->cNamedArgs) {
FIXME("named args not supported\n");
return E_NOTIMPL;
}
new_dp.rgvarg = heap_alloc((dp->cArgs+1)*sizeof(VARIANTARG));
if(!new_dp.rgvarg)
return E_OUTOFMEMORY;
new_dp.cArgs = dp->cArgs+1;
memcpy(new_dp.rgvarg+1, dp->rgvarg, dp->cArgs*sizeof(VARIANTARG));
V_VT(new_dp.rgvarg) = VT_DISPATCH;
V_DISPATCH(new_dp.rgvarg) = (IDispatch*)&This->IDispatchEx_iface;
hres = IDispatch_QueryInterface(func_disp, &IID_IDispatchEx, (void**)&dispex);
TRACE(">>>\n");
if(SUCCEEDED(hres)) {
hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, flags, &new_dp, res, ei, caller);
IDispatchEx_Release(dispex);
}else {
ULONG err = 0;
hres = IDispatch_Invoke(func_disp, DISPID_VALUE, &IID_NULL, lcid, flags, &new_dp, res, ei, &err);
}
if(SUCCEEDED(hres))
TRACE("<<< %s\n", debugstr_variant(res));
else
WARN("<<< %08x\n", hres);
heap_free(new_dp.rgvarg);
return hres;
}
开发者ID:Svyatpro,项目名称:winelastd3d10,代码行数:40,代码来源:dispex.c
示例13: notif_enabled
static void notif_enabled(PluginHost *plugin_host)
{
DISPPARAMS args = {NULL, NULL, 0, 0};
IDispatch *disp;
ULONG err = 0;
VARIANT res;
HRESULT hres;
hres = IUnknown_QueryInterface(plugin_host->plugin_unk, &IID_IDispatch, (void**)&disp);
if(FAILED(hres)) {
FIXME("Could not get IDispatch iface: %08x\n", hres);
return;
}
V_VT(&res) = VT_EMPTY;
hres = IDispatch_Invoke(disp, DISPID_ENABLED, &IID_NULL, 0/*FIXME*/, DISPATCH_PROPERTYGET, &args, &res, NULL, &err);
IDispatch_Release(disp);
if(SUCCEEDED(hres)) {
FIXME("Got enabled %s\n", debugstr_variant(&res));
VariantClear(&res);
}
}
开发者ID:miurahr,项目名称:wine,代码行数:22,代码来源:pluginhost.c
示例14: get_client_disp_property
HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
{
IDispatch *disp = NULL;
DISPPARAMS dispparams = {NULL, 0};
UINT err;
HRESULT hres;
hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
if(FAILED(hres)) {
TRACE("Could not get IDispatch\n");
return hres;
}
VariantInit(res);
hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
IDispatch_Release(disp);
return hres;
}
开发者ID:Dietr1ch,项目名称:wine,代码行数:22,代码来源:oleobj.c
示例15: disp_call
HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp, VARIANT *retv)
{
const WORD flags = DISPATCH_METHOD|(retv ? DISPATCH_PROPERTYGET : 0);
IDispatchEx *dispex;
EXCEPINFO ei;
HRESULT hres;
memset(&ei, 0, sizeof(ei));
if(retv)
V_VT(retv) = VT_EMPTY;
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(FAILED(hres)) {
UINT err = 0;
TRACE("using IDispatch\n");
return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err);
}
hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */);
IDispatchEx_Release(dispex);
return hres;
}
开发者ID:Strongc,项目名称:reactos,代码行数:23,代码来源:vbdisp.c
示例16: invoke_plugin_prop
HRESULT invoke_plugin_prop(HTMLPluginContainer *plugin_container, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
VARIANT *res, EXCEPINFO *ei)
{
PluginHost *host;
host = plugin_container->plugin_host;
if(!host || !host->disp) {
FIXME("Called with no disp\n");
return E_UNEXPECTED;
}
if(!check_script_safety(host)) {
FIXME("Insecure object\n");
return E_FAIL;
}
if(id < MSHTML_DISPID_CUSTOM_MIN || id > MSHTML_DISPID_CUSTOM_MIN + plugin_container->props_len) {
ERR("Invalid id\n");
return E_FAIL;
}
return IDispatch_Invoke(host->disp, plugin_container->props[id-MSHTML_DISPID_CUSTOM_MIN], &IID_NULL,
lcid, flags, params, res, ei, NULL);
}
开发者ID:miurahr,项目名称:wine,代码行数:24,代码来源:pluginhost.c
示例17: create_enumerator
static HRESULT create_enumerator(script_ctx_t *ctx, jsval_t *argv, jsdisp_t **ret)
{
EnumeratorInstance *enumerator;
HRESULT hres;
IDispatch *obj;
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
IEnumVARIANT *enumvar = NULL;
if (argv)
{
VARIANT varresult;
if (!is_object_instance(*argv))
{
FIXME("I don't know how to handle this type!\n");
return E_NOTIMPL;
}
obj = get_object(*argv);
/* Try to get a IEnumVARIANT by _NewEnum */
VariantInit(&varresult);
hres = IDispatch_Invoke(obj, DISPID_NEWENUM, &IID_NULL, LOCALE_NEUTRAL,
DISPATCH_METHOD, &dispparams, &varresult, NULL, NULL);
if (FAILED(hres))
{
WARN("Enumerator: no DISPID_NEWENUM.\n");
return E_INVALIDARG;
}
if ((V_VT(&varresult) == VT_DISPATCH) || (V_VT(&varresult) == VT_UNKNOWN))
{
hres = IUnknown_QueryInterface(V_UNKNOWN(&varresult),
&IID_IEnumVARIANT, (void**)&enumvar);
}
else
{
FIXME("Enumerator: NewEnum unexpected type of varresult (%d).\n", V_VT(&varresult));
hres = E_INVALIDARG;
}
VariantClear(&varresult);
if (FAILED(hres))
return hres;
}
hres = alloc_enumerator(ctx, NULL, &enumerator);
if (FAILED(hres))
{
if (enumvar)
IEnumVARIANT_Release(enumvar);
return hres;
}
enumerator->enumvar = enumvar;
enumerator->atend = !enumvar;
hres = enumvar_get_next_item(enumerator);
if (FAILED(hres))
{
jsdisp_release(&enumerator->dispex);
return hres;
}
*ret = &enumerator->dispex;
return S_OK;
}
开发者ID:wine-mirror,项目名称:wine,代码行数:65,代码来源:enumerator.c
示例18: IDispatch_Invoke_Stub
HRESULT __RPC_STUB IDispatch_Invoke_Stub(
IDispatch* This,
DISPID dispIdMember,
REFIID riid,
LCID lcid,
DWORD dwFlags,
DISPPARAMS* pDispParams,
VARIANT* pVarResult,
EXCEPINFO* pExcepInfo,
UINT* pArgErr,
UINT cVarRef,
UINT* rgVarRefIdx,
VARIANTARG* rgVarRef)
{
HRESULT hr = S_OK;
VARIANTARG *rgvarg, *arg;
UINT u;
/* initialize out parameters, so that they can be marshalled
* in case the real Invoke doesn't initialize them */
VariantInit(pVarResult);
memset(pExcepInfo, 0, sizeof(*pExcepInfo));
*pArgErr = 0;
/* let the real Invoke operate on a copy of the in parameters,
* so we don't risk losing pointers to allocated memory */
rgvarg = pDispParams->rgvarg;
arg = CoTaskMemAlloc(sizeof(VARIANTARG)*pDispParams->cArgs);
if (!arg) return E_OUTOFMEMORY;
/* init all args so we can call VariantClear on all the args if the copy
* below fails */
for (u = 0; u < pDispParams->cArgs; u++)
VariantInit(&arg[u]);
for (u = 0; u < pDispParams->cArgs; u++) {
hr = VariantCopy(&arg[u], &rgvarg[u]);
if (FAILED(hr))
break;
}
if (SUCCEEDED(hr)) {
pDispParams->rgvarg = arg;
hr = IDispatch_Invoke(This,
dispIdMember,
riid,
lcid,
dwFlags,
pDispParams,
pVarResult,
pExcepInfo,
pArgErr);
/* copy ref args to out list */
for (u=0; u<cVarRef; u++) {
unsigned i = rgVarRefIdx[u];
VariantInit(&rgVarRef[u]);
VariantCopy(&rgVarRef[u], &arg[i]);
/* clear original if equal, to avoid double-free */
if (V_BYREF(&rgVarRef[u]) == V_BYREF(&rgvarg[i]))
VariantClear(&rgvarg[i]);
}
}
/* clear the duplicate argument list */
for (u=0; u<pDispParams->cArgs; u++)
VariantClear(&arg[u]);
pDispParams->rgvarg = rgvarg;
CoTaskMemFree(arg);
return hr;
}
开发者ID:howard5888,项目名称:wineT,代码行数:74,代码来源:usrmarshal.c
示例19: call_script
/*
* Call a script.
*/
DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action)
{
HRESULT hr;
IActiveScript *pActiveScript = NULL;
IActiveScriptParse *pActiveScriptParse = NULL;
MsiActiveScriptSite *pActiveScriptSite = NULL;
IDispatch *pDispatch = NULL;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
DISPID dispid;
CLSID clsid;
VARIANT var;
/* Return success by default (if Windows Script not installed) - not native behavior. This
* should be here until we implement wine scripting. */
DWORD ret = ERROR_SUCCESS;
CoInitialize(NULL);
/* Create MsiActiveScriptSite object */
hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite);
if (hr != S_OK) goto done;
/* Create an installer object */
hr = create_msiserver(NULL, (LPVOID *)&pActiveScriptSite->pInstaller);
if (hr != S_OK) goto done;
/* Create a session object */
hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
if (hr != S_OK) goto done;
/* Create the scripting engine */
if ((type & 7) == msidbCustomActionTypeJScript)
hr = CLSIDFromProgID(szJScript, &clsid);
else if ((type & 7) == msidbCustomActionTypeVBScript)
hr = CLSIDFromProgID(szVBScript, &clsid);
else {
ERR("Unknown script type %d\n", type);
goto done;
}
if (FAILED(hr)) {
ERR("Could not find CLSID for Windows Script\n");
goto done;
}
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IActiveScript, (void **)&pActiveScript);
if (FAILED(hr)) {
ERR("Could not instantiate class for Windows Script\n");
goto done;
}
/* If we got this far, Windows Script is installed, so don't return success by default anymore */
ret = ERROR_INSTALL_FAILURE;
/* Get the IActiveScriptParse engine interface */
hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse, (void **)&pActiveScriptParse);
if (FAILED(hr)) goto done;
/* Give our host to the engine */
hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
if (FAILED(hr)) goto done;
/* Initialize the script engine */
hr = IActiveScriptParse64_InitNew(pActiveScriptParse);
if (FAILED(hr)) goto done;
/* Add the session object */
hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_ISVISIBLE);
/* Pass the script to the engine */
hr = IActiveScriptParse64_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
if (FAILED(hr)) goto done;
/* Start processing the script */
hr = IActiveScript_SetScriptState(pActiveScript, SCRIPTSTATE_CONNECTED);
if (FAILED(hr)) goto done;
/* Call a function if necessary through the IDispatch interface */
if (function != NULL && strlenW(function) > 0) {
TRACE("Calling function %s\n", debugstr_w(function));
hr = IActiveScript_GetScriptDispatch(pActiveScript, NULL, &pDispatch);
if (FAILED(hr)) goto done;
hr = IDispatch_GetIDsOfNames(pDispatch, &IID_NULL, (WCHAR **)&function, 1,LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) goto done;
hr = IDispatch_Invoke(pDispatch, dispid, &IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, &var, NULL, NULL);
if (FAILED(hr)) goto done;
/* Check return value, if it's not IDOK we failed */
hr = VariantChangeType(&var, &var, 0, VT_I4);
if (FAILED(hr)) goto done;
if (V_I4(&var) == IDOK)
ret = ERROR_SUCCESS;
else ret = ERROR_INSTALL_FAILURE;
VariantClear(&var);
//.........这里部分代码省略.........
开发者ID:bilboed,项目名称:wine,代码行数:101,代码来源:script.c
示例20: zend_throw_error
zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int by_ref)
{
php_com_dotnet_object *obj;
struct php_com_iterator *I;
IEnumVARIANT *iev = NULL;
DISPPARAMS dp;
VARIANT v;
unsigned long n_fetched;
zval ptr;
if (by_ref) {
zend_throw_error(NULL, "An iterator cannot be used with foreach by reference");
return NULL;
}
obj = CDNO_FETCH(object);
if (V_VT(&obj->v) != VT_DISPATCH && !V_ISARRAY(&obj->v)) {
php_error_docref(NULL, E_WARNING, "variant is not an object or array VT=%d", V_VT(&obj->v));
return NULL;
}
memset(&dp, 0, sizeof(dp));
VariantInit(&v);
I = (struct php_com_iterator*)ecalloc(1, sizeof(*I));
zend_iterator_init(&I->iter);
I->iter.funcs = &com_iter_funcs;
Z_PTR(I->iter.data) = I;
I->code_page = obj->code_page;
ZVAL_UNDEF(&I->zdata);
VariantInit(&I->safe_array);
VariantInit(&I->v);
if (V_ISARRAY(&obj->v)) {
LONG bound;
UINT dims;
dims = SafeArrayGetDim(V_ARRAY(&obj->v));
if (dims != 1) {
php_error_docref(NULL, E_WARNING,
"Can only handle single dimension variant arrays (this array has %d)", dims);
goto fail;
}
/* same semantics as foreach on a PHP array;
* make a copy and enumerate that copy */
VariantCopy(&I->safe_array, &obj->v);
/* determine the key value for the array */
SafeArrayGetLBound(V_ARRAY(&I->safe_array), 1, &bound);
SafeArrayGetUBound(V_ARRAY(&I->safe_array), 1, &I->sa_max);
/* pre-fetch the element */
if (php_com_safearray_get_elem(&I->safe_array, &I->v, bound)) {
I->key = bound;
ZVAL_NULL(&ptr);
php_com_zval_from_variant(&ptr, &I->v, I->code_page);
ZVAL_COPY_VALUE(&I->zdata, &ptr);
} else {
I->key = (ulong)-1;
}
} else {
/* can we enumerate it? */
if (FAILED(IDispatch_Invoke(V_DISPATCH(&obj->v), DISPID_NEWENUM,
&IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD|DISPATCH_PROPERTYGET,
&dp, &v, NULL, NULL))) {
goto fail;
}
/* get something useful out of it */
if (V_VT(&v) == VT_UNKNOWN) {
IUnknown_QueryInterface(V_UNKNOWN(&v), &IID_IEnumVARIANT, (void**)&iev);
} else if (V_VT(&v) == VT_DISPATCH) {
IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IEnumVARIANT, (void**)&iev);
}
VariantClear(&v);
if (iev == NULL) {
goto fail;
}
I->ev = iev;
/* Get the first element now */
if (SUCCEEDED(IEnumVARIANT_Next(I->ev, 1, &I->v, &n_fetched)) && n_fetched > 0) {
/* indicate that we have element 0 */
I->key = 0;
ZVAL_NULL(&ptr);
php_com_zval_from_variant(&ptr, &I->v, I->code_page);
ZVAL_COPY_VALUE(&I->zdata, &ptr);
} else {
/* indicate that there are no more items */
I->key = (ulong)-1;
}
}
//.........这里部分代码省略.........
开发者ID:DaveRandom,项目名称:php-src,代码行数:101,代码来源:com_iterator.c
注:本文中的IDispatch_Invoke函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论