3,248
社区成员




void BeforeNavigate2(
IDispatch *pDisp,
VARIANT *url,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers,
VARIANT_BOOL *Cancel
)
Begin_Disp_Map(WebPageFilter)
Disp_Method(DISPID_BEFORENAVIGATE2, BeforeNavigate2, void, 7, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL *)
End_Disp_Map()
template<>
class CVarTypeInfo< LPVARIANT >
{
public:
static const VARTYPE VT = VT_BYREF|VT_VARIANT;
static LPVARIANT VARIANT::* const pmField;
};
__declspec( selectany ) LPVARIANT VARIANT::* const CVarTypeInfo< LPVARIANT >::pmField = &VARIANT::pvarVal;
#define __param_type(n, ...) if (FAILED(v[n-1].ChangeType(CVarTypeInfo<T##n>::VT, &dp->rgvarg[dp->cArgs-n])))
template<>
class CVarTypeInfo< short* >
{
public:
static const VARTYPE VT = VT_I2|VT_BYREF;
static short* VARIANT::* const pmField;
};
__declspec( selectany ) short* VARIANT::* const CVarTypeInfo< short* >::pmField = &VARIANT::piVal;
#define __param_type(n, ...) \
do \
{ \
if( CVarTypeInfo<T##n>::VT != dp->rgvarg[dp->cArgs-n].vt) {return E_INVALIDARG;} \
HRESULT hr = v[n-1].Copy(&dp->rgvarg[dp->cArgs-n]); \
if (FAILED(hr)) \
{ \
TRACE(_T("arg%d, Copy VARIANT failed!(type:0x%x,\n"), n, CVarTypeInfo<T##n>::VT); \
return E_INVALIDARG; \
} \
} while (0);
class VARIANT_BOOL_POINTER_WAPPER
{
public:
VARIANT_BOOL_POINTER_WAPPER(VARIANT_BOOL * pBool){ p = pBool; }
VARIANT_BOOL * p;
};
class CVarTypeInfo< VARIANT_BOOL_POINTER_WAPPER >
{
public:
static const VARTYPE VT = VT_BYREF|VT_BOOL;
static VARIANT_BOOL * VARIANT::* const pmField;
};
__declspec( selectany ) VARIANT_BOOL * VARIANT::* const CVarTypeInfo<VARIANT_BOOL_POINTER_WAPPER>::pmField = &VARIANT::pboolVal;
Begin_Disp_Map(WebPageFilter)
Disp_Method(DISPID_BEFORENAVIGATE2, BeforeNavigate2, void, 7, IDispatch*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL_POINTER_WAPPER)
End_Disp_Map()
void WebPageFilter::BeforeNavigate2(
//VARIANT *pDisp,
IDispatch *pDisp,
VARIANT *url,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers,
VARIANT_BOOL_POINTER_WAPPER Cancel
)
{
TRACE(_T("WebPageFilter::BeforeNavigate2\n"));
VARIANT_BOOL * pCancel = Cancel.p;
*pCancel = VARIANT_TRUE; //能生效
}
// 旧版写法
#define Disp_PropertyGet(dispid, name, type) \
{OLESTR(#name), dispid, _get_helper(owner_class,name,type), NULL, NULL},
#define Disp_PropertyPut(dispid, name, type) \
{OLESTR(#name), dispid, NULL, _put_helper(owner_class,name,type), NULL},
#define Disp_Property(dispid, name, type) \
{OLESTR(#name), dispid, _get_helper(owner_class,name,type), _put_helper(owner_class,name,type), NULL},
// 新版写法
#define Disp_PropertyGet(dispid, name, ...) \
{OLESTR(#name), dispid, \
__if_exists(owner_class::Get##name){_getfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Get##name){ \
__if_exists(owner_class::name){_get_helper(owner_class,name,__VA_ARGS__)} \
__if_not_exists(owner_class::name){NULL \
__pragma(message("WARNING: property '" #name "' can't be got, and will be ignored. FILE(" __FILE__ ") LINE(" __to_string(__LINE__) ")")) \
} \
}, \
NULL, NULL},
#define Disp_PropertyPut(dispid, name, ...) /* ...==type */ \
{OLESTR(#name), dispid, NULL, \
__if_exists(owner_class::Set##name){_setfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Set##name){ \
__if_exists(owner_class::Put##name){_putfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Put##name){ \
__if_exists(owner_class::name){_put_helper(owner_class,name,__VA_ARGS__)} \
__if_not_exists(owner_class::name){NULL \
__pragma(message("WARNING: property '" #name "' can't be put, and will be ignored. FILE(" __FILE__ ") LINE(" __to_string(__LINE__) ")")) \
} \
} \
}, \
NULL},
#define Disp_Property(dispid, name, ...) /* ...==type */ \
{OLESTR(#name), dispid, \
__if_exists(owner_class::Get##name){_getfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Get##name){ \
__if_exists(owner_class::name){_get_helper(owner_class,name,__VA_ARGS__)} \
__if_not_exists(owner_class::name){NULL \
__pragma(message("WARNING: property '" #name "' can't be got, and will be ignored. FILE(" __FILE__ ") LINE(" __to_string(__LINE__) ")")) \
} \
}, \
__if_exists(owner_class::Set##name){_setfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Set##name){ \
__if_exists(owner_class::Put##name){_putfunc_helper(owner_class,name)} \
__if_not_exists(owner_class::Put##name){ \
__if_exists(owner_class::name){_put_helper(owner_class,name,__VA_ARGS__)} \
__if_not_exists(owner_class::name){NULL \
__pragma(message("WARNING: property '" #name "' can't be put, and will be ignored. FILE(" __FILE__ ") LINE(" __to_string(__LINE__) ")")) \
} \
} \
}, \
NULL},