微软的dsoframer.ocx V1.3.1323.0版本,需要在IE上设置“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本“,
通过其源码下面2个函数的修改,可以解决该问题,
需要注意带来的新问题:微软的ocx带数字签名,自己编写的不带有签名,而申请数字签名动辄上千元
修改位置:
1. 文件:dsofcontrol.cpp
函数:STDMETHODIMP CDsoFramerControl::XObjectSafety::GetInterfaceSafetyOptions
内容:
//*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
//return S_OK;
if (riid == IID_IDispatch)
{
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
return S_OK;
}
else if (riid == IID_IPersistPropertyBag ||
riid == IID_IPersistStreamInit ||
riid == IID_IPersistStorage ||
riid == IID_IPersistMemory)
{
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
return S_OK;
}
return E_NOINTERFACE;
2. 文件:dsofcontrol.cpp
函数:STDMETHODIMP CDsoFramerControl::XObjectSafety::SetInterfaceSafetyOptions
内容:
//return ((((riid == IID_IPersist) || (riid == IID_IPersistPropertyBag)) &&
// (dwEnabledOptions == INTERFACESAFE_FOR_UNTRUSTED_DATA)) ? S_OK : E_FAIL);
if (riid == IID_IDispatch)
{
BOOL bFalg = INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask &&
INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions;
return bFalg ? S_OK : E_FAIL;
}
else if (riid == IID_IPersistPropertyBag
|| riid == IID_IPersistStreamInit
|| riid == IID_IPersistStorage
|| riid == IID_IPersistMemory)
{
BOOL bFalg = INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask &&
INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions;
return bFalg ? NOERROR : E_FAIL;
}
return E_NOINTERFACE;