我有一个控件,实现了SAFE FOR SCRIPTING AND SAFE FOR INITIALIZING, 并且实现了IObjectSafe,且在两个方法中都返回S_OK,也就是标记我的控件对初始化和脚本都是安全的,但是当在服务器上测试的时候,如果将客户端的IE安全设置中的对未标记为安全ActiveX控件的初始化和脚本设为提示,则一切正常,如果设为启用的话,则在第一次打开网页(即下载并注册控件时)正常,但如果以后再打开网页,则弹出对话框说意外的调用了方法和属性访问.这是怎么回事,该如何解决.
//*****************************安全接口添加代码***************
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
/* [in] */ REFIID riid,
/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions
);
STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
/* [in] */ REFIID riid,
/* [in] */ DWORD dwOptionSetMask,
/* [in] */ DWORD dwEnabledOptions
);
END_INTERFACE_PART(ObjSafe);
//*****************************安全接口添加代码***************
在实现文件中添加如下代码
//*****************************安全接口添加代码***************
BEGIN_INTERFACE_MAP( CTestComponent, COleControl )
INTERFACE_PART(CTestComponent, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()ULONG FAR EXPORT CTestComponent::XObjSafe::AddRef()
{
METHOD_PROLOGUE(CTestComponent, ObjSafe)
return pThis->ExternalAddRef();
}ULONG FAR EXPORT CTestComponent::XObjSafe::Release()
{
METHOD_PROLOGUE(CTestComponent, ObjSafe)
return pThis->ExternalRelease();
}HRESULT FAR EXPORT CTestComponent::XObjSafe::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CTestComponent, ObjSafe)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~ dwSupportedBits;HRESULT STDMETHODCALLTYPE
CTestComponent::XObjSafe::GetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
{
METHOD_PROLOGUE(CTestComponent, ObjSafe) HRESULT retval = ResultFromScode(S_OK); IUnknown FAR* punkInterface;
retval = pThis->ExternalQueryInterface(&riid,
(void * *)&punkInterface);
if (retval != E_NOINTERFACE) { // interface exists
punkInterface->Release(); // release it -- just checking!
}
// we support both kinds of safety and have always both set,
// regardless of interface
*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits; return retval; // E_NOINTERFACE if QI failed
}HRESULT STDMETHODCALLTYPE
CTestComponent::XObjSafe::SetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [in] */ DWORD dwOptionSetMask,
/* [in] */ DWORD dwEnabledOptions)
{
METHOD_PROLOGUE(CTestComponent, ObjSafe)
// does interface exist?
IUnknown FAR* punkInterface;
pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (punkInterface) { // interface exists
punkInterface->Release(); // release it -- just checking!
}
else { // interface doesn't exist
return ResultFromScode(E_NOINTERFACE);
} // can't set bits we don't support
if (dwOptionSetMask & dwNotSupportedBits) {
return ResultFromScode(E_FAIL);
}
// can't set bits we do support to zero
dwEnabledOptions &= dwSupportedBits;
// (we already know there are no extra bits in mask )
if ((dwOptionSetMask & dwEnabledOptions) !=
dwOptionSetMask) {
return ResultFromScode(E_FAIL);
}
// don't need to change anything since we're always safe
return ResultFromScode(S_OK);
}
//*****************************安全接口添加代码***************注意:把CTestComponent换成你的类名字就可以了
这样设置就好了:IE菜单Tools->Internet Options->Security->Custom Level->然后把所有与ActiveX controls and Plug-ins相关的项都设为Enable,就ok了
把自己置成safe不就行了:)