需要实现IObjectSafety接口
打“开工程名Ctl.h”在最上面添加 #include <objsafe.h>
在类中的DECLARE_DYNCREATE(C工程名Ctrl)下面添加以下代码,
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
打开“工程名Ctl.cpp”在BOOL C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry(BOOL bRegister)函数上面或者下面添加如下代码
/
// Interface map for IObjectSafety
BEGIN_INTERFACE_MAP( C工程名Ctrl, COleControl )
INTERFACE_PART(C工程名Ctrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()
/
// IObjectSafety member functions
// Delegate AddRef, Release, QueryInterface
ULONG FAR EXPORT C工程名Ctrl::XObjSafe::AddRef()
{
ULONG FAR EXPORT C工程名Ctrl::XObjSafe::Release()
{
HRESULT FAR EXPORT C工程名Ctrl::XObjSafe::QueryInterface(
}
const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
const DWORD dwNotSupportedBits = ~ dwSupportedBits;
/
// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOption
s
// Allows container to query what interfaces are safe for what. We’re
// optimizing significantly by ignoring which interface the caller is
// asking for.
HRESULT STDMETHODCALLTYPE
C工程名Ctrl::XObjSafe::GetInterfaceSafetyOption
s(REFIID riid,
DWORD __RPC_FAR *pdwEnabledOptions)
{
METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)
IUnknown FAR* punkInterface;
punkInterface->Release(); // release it–just checking!
// regardless of interface
}
/
// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOption
s
// Since we’re always safe, this is a no-brainer–but we do check to make
// sure the interface requested exists and that the options we’re asked to
// set exist and are set on (we don’t support unsafe mode).
HRESULT STDMETHODCALLTYPE
// does interface exist?
pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
punkInterface->Release(); // release it–just checking!
else { // interface doesn’t exist
}
if (dwOptionSetMask & dwNotSupportedBits) {
}
// can’t set bits we do support to zero
// (we already know there are no extra bits in mask )
}
// don’t need to change anything since we’re always safe
}