当前位置:   article > 正文

ActiveX控件实现IobjectSafety接口_cdxr

cdxr

如果没有实现IobjectSafety接口浏览器会提示交互不安全等信息

 

打开工程名Ctl.h
搜索    class C工程名Ctrl : public COleControl
在其上面添加   #include <objsafe.h>
搜索    DECLARE_DYNCREATE(C工程名Ctrl)


下面添加

  1. DECLARE_INTERFACE_MAP()
  2. BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
  3. STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
  4. REFIID riid,
  5. DWORD __RPC_FAR *pdwSupportedOptions,
  6. DWORD __RPC_FAR *pdwEnabledOptions
  7. );
  8. STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
  9. REFIID riid,
  10. DWORD dwOptionSetMask,
  11. DWORD dwEnabledOptions
  12. );
  13. END_INTERFACE_PART(ObjSafe);


打开工程名Ctl.cpp
搜索    BOOL C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry(BOOL bRegister)

  1. /
  2. // Interface map for IObjectSafety
  3. BEGIN_INTERFACE_MAP(CDxrOcxCtrl, COleControl)
  4. INTERFACE_PART(CDxrOcxCtrl, IID_IObjectSafety, ObjSafe)
  5. END_INTERFACE_MAP()
  6. /
  7. // IObjectSafety member functions
  8. // Delegate AddRef, Release, QueryInterface
  9. ULONG FAR EXPORT CDxrOcxCtrl::XObjSafe::AddRef()
  10. {
  11. METHOD_PROLOGUE(CDxrOcxCtrl, ObjSafe)
  12. return pThis->ExternalAddRef();
  13. }
  14. ULONG FAR EXPORT CDxrOcxCtrl::XObjSafe::Release()
  15. {
  16. METHOD_PROLOGUE(CDxrOcxCtrl, ObjSafe)
  17. return pThis->ExternalRelease();
  18. }
  19. HRESULT FAR EXPORT CDxrOcxCtrl::XObjSafe::QueryInterface(
  20. REFIID iid, void FAR* FAR* ppvObj)
  21. {
  22. METHOD_PROLOGUE(CDxrOcxCtrl, ObjSafe)
  23. return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
  24. }
  25. const DWORD dwSupportedBits =
  26. INTERFACESAFE_FOR_UNTRUSTED_CALLER |
  27. INTERFACESAFE_FOR_UNTRUSTED_DATA;
  28. const DWORD dwNotSupportedBits = ~dwSupportedBits;
  29. /
  30. // CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions
  31. // Allows container to query what interfaces are safe for what. We're
  32. // optimizing significantly by ignoring which interface the caller is
  33. // asking for.
  34. HRESULT STDMETHODCALLTYPE
  35. CDxrOcxCtrl::XObjSafe::GetInterfaceSafetyOptions(
  36. REFIID riid,
  37. DWORD __RPC_FAR *pdwSupportedOptions,
  38. DWORD __RPC_FAR *pdwEnabledOptions)
  39. {
  40. METHOD_PROLOGUE(CDxrOcxCtrl, ObjSafe)
  41. HRESULT retval = ResultFromScode(S_OK);
  42. // does interface exist?
  43. IUnknown FAR* punkInterface;
  44. retval = pThis->ExternalQueryInterface(&riid,
  45. (void * *)&punkInterface);
  46. if (retval != E_NOINTERFACE) { // interface exists
  47. punkInterface->Release(); // release it--just checking!
  48. }
  49. // we support both kinds of safety and have always both set,
  50. // regardless of interface
  51. *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
  52. return retval; // E_NOINTERFACE if QI failed
  53. }
  54. /
  55. // CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions
  56. // Since we're always safe, this is a no-brainer--but we do check to make
  57. // sure the interface requested exists and that the options we're asked to
  58. // set exist and are set on (we don't support unsafe mode).
  59. HRESULT STDMETHODCALLTYPE
  60. CDxrOcxCtrl::XObjSafe::SetInterfaceSafetyOptions(
  61. REFIID riid,
  62. DWORD dwOptionSetMask,
  63. DWORD dwEnabledOptions)
  64. {
  65. METHOD_PROLOGUE(CDxrOcxCtrl, ObjSafe)
  66. // does interface exist?
  67. IUnknown FAR* punkInterface;
  68. pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
  69. if (punkInterface) { // interface exists
  70. punkInterface->Release(); // release it--just checking!
  71. }
  72. else { // interface doesn't exist
  73. return ResultFromScode(E_NOINTERFACE);
  74. }
  75. // can't set bits we don't support
  76. if (dwOptionSetMask & dwNotSupportedBits) {
  77. return ResultFromScode(E_FAIL);
  78. }
  79. // can't set bits we do support to zero
  80. dwEnabledOptions &= dwSupportedBits;
  81. // (we already know there are no extra bits in mask )
  82. if ((dwOptionSetMask & dwEnabledOptions) !=
  83. dwOptionSetMask) {
  84. return ResultFromScode(E_FAIL);
  85. }
  86. // don't need to change anything since we're always safe
  87. return ResultFromScode(S_OK);
  88. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/342809
推荐阅读
相关标签
  

闽ICP备14008679号