C++开发ActiveX控件相关事项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++开发ActiveX控件相关事项相关的知识,希望对你有一定的参考价值。
1.UUID值:
XXXX.idl最下部:
// CMsgPromptCtrl 的类信息
[
uuid(84045072-8AA6-40D2-A641-0097F7F6650F)
]
coclass MsgPrompt
{
[default] dispinterface _DMsgPrompt;
[default, source] dispinterface _DMsgPromptEvents;
};
2.安全代码:
在XXXCtrl.h中添加
#include <objsafe.h>
//安全代码
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions
);
STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions
);
END_INTERFACE_PART(ObjSafe);
在XXXXCtrl.Cpp中添加:
//安全代码
BEGIN_INTERFACE_MAP( CMsgPromptCtrl, COleControl )
INTERFACE_PART(CMsgPromptCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()
//安全代码;
ULONG FAR EXPORT CMsgPromptCtrl::XObjSafe::AddRef()
{
METHOD_PROLOGUE(CMsgPromptCtrl, ObjSafe)
return pThis->ExternalAddRef();
}
ULONG FAR EXPORT CMsgPromptCtrl::XObjSafe::Release()
{
METHOD_PROLOGUE(CMsgPromptCtrl, ObjSafe)
return pThis->ExternalRelease();
}
HRESULT FAR EXPORT CMsgPromptCtrl::XObjSafe::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CMsgPromptCtrl, ObjSafe)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~ dwSupportedBits;
HRESULT STDMETHODCALLTYPE CMsgPromptCtrl::XObjSafe::GetInterfaceSafetyOptions(
REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions
)
{
METHOD_PROLOGUE(CMsgPromptCtrl, ObjSafe)
HRESULT retval = ResultFromScode(S_OK);
// 接口是否存在
IUnknown FAR* punkInterface;
retval = pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (retval != E_NOINTERFACE) // 接口存在
{
punkInterface->Release(); // 释放引用
}
// We support both kinds of safety and have always both set,
// regardless of interface.
*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
return retval; // E_NOINTERFACE if QI failed
}
//////////////////////////////////////////////////////////// /////////////////
// CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions
HRESULT STDMETHODCALLTYPE CMsgPromptCtrl::XObjSafe::SetInterfaceSafetyOptions(
REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions
)
{
METHOD_PROLOGUE(CMsgPromptCtrl, ObjSafe)
// 接口是否存在
IUnknown FAR* punkInterface;
pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (punkInterface) // 接口存在
{
punkInterface->Release(); // 释放引用
}
else // 接口不存在
{
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);
}
3.添加接口和事件:
添加接口:
XXXXLib下的DXXXX右键-->添加-->添加方法
添加事件:
XXXXCtrl右键-->添加-->添加事件
以上是关于C++开发ActiveX控件相关事项的主要内容,如果未能解决你的问题,请参考以下文章
C# .Net 4.0 应用程序中托管的 C++ ActiveX 控件中的 Xml.Serializer 非法强制转换异常