반응형

ctrl 해더

#include <ObjSafe.h>

 DECLARE_DYNCREATE(CBTool2Ctrl)


// ObjSafe 시작
 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);
// ObjSafe 끝

ctrl 코드

// IObjectSafety 용 인터페이스맵입니다

BEGIN_INTERFACE_MAP( CBTool2Ctrl, COleControl )
INTERFACE_PART(CBTool2Ctrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()


/////////////////////////////////////////////////////////////
// IObjectSafety member functions

ULONG FAR EXPORT CBTool2Ctrl::XObjSafe::AddRef()
{
 METHOD_PROLOGUE(CBTool2Ctrl, ObjSafe)
 return pThis->ExternalAddRef();
}

ULONG FAR EXPORT CBTool2Ctrl::XObjSafe::Release()
{
 METHOD_PROLOGUE(CBTool2Ctrl, ObjSafe)
 return pThis->ExternalRelease();
}

HRESULT FAR EXPORT CBTool2Ctrl::XObjSafe::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj)
{
 METHOD_PROLOGUE(CBTool2Ctrl, ObjSafe)
 return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~ dwSupportedBits;

HRESULT STDMETHODCALLTYPE
CBTool2Ctrl::XObjSafe::GetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
{
 METHOD_PROLOGUE(CBTool2Ctrl, ObjSafe)

 HRESULT retval = ResultFromScode(S_OK);

 // does interface exist?
 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
CBTool2Ctrl::XObjSafe::SetInterfaceSafetyOptions(
/* [in] */ REFIID riid,
/* [in] */ DWORD dwOptionSetMask,
/* [in] */ DWORD dwEnabledOptions)
{
 METHOD_PROLOGUE(CBTool2Ctrl, 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);
}

'develop > windows' 카테고리의 다른 글

C# ActiveX 만들기  (0) 2010.09.29
ActiveX 에서 다른 ActiveX를 생성할 때 주의점  (0) 2010.07.29
BOOST 컴파일 옵션  (0) 2010.02.03
메모리릭 발생 위치에 Breakpoint 설정하기  (0) 2010.02.03
MS Patch API  (0) 2010.02.03

+ Recent posts