- ocx
- 在ocx的接口.cpp上头部添加头文件应用 #include <objsafe.h>
- 在添加以下三个函数:
-
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) { ICatRegister* pcr = NULL ; HRESULT hr = S_OK ; hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); if (FAILED(hr)) return hr; // Make sure the HKCR\Component Categories\{..catid...} // key is registered CATEGORYINFO catinfo; catinfo.catid = catid; catinfo.lcid = 0x0409 ; // english // Make sure the provided description is not too long. // Only copy the first 127 characters if it is int len = wcslen(catDescription); if (len>127) len = 127; wcsncpy_s(catinfo.szDescription, catDescription, len); // Make sure the description is null terminated catinfo.szDescription[len] = '\0'; hr = pcr->RegisterCategories(1, &catinfo); pcr->Release(); return hr; } HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid) { // Register your component categories information. ICatRegister* pcr = NULL ; HRESULT hr = S_OK ; hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); if (SUCCEEDED(hr)) { // Register this category as being "implemented" by // the class. CATID rgcatid[1] ; rgcatid[0] = catid; hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid); } if (pcr != NULL) pcr->Release(); return hr; } HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid) { ICatRegister* pcr = NULL ; HRESULT hr = S_OK ; hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); if (SUCCEEDED(hr)) { // Unregister this category as being "implemented" by // the class. CATID rgcatid[1] ; rgcatid[0] = catid; hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid); } if (pcr != NULL) pcr->Release(); return hr; }
更新BOOL C***Ctrl::C***CtrlFactory::UpdateRegistry(BOOL bRegister)
BOOL CGoPrintAXCtrl::CGoPrintAXCtrlFactory::UpdateRegistry(BOOL bRegister) { // TODO: 验证您的控件是否符合单元模型线程处理规则。 // 有关更多信息,请参考 MFC 技术说明 64。 // 如果您的控件不符合单元模型规则,则 // 必须修改如下代码,将第六个参数从 // afxRegApartmentThreading 改为 0。 HRESULT hr = S_OK ; if (bRegister){ // register as safe for scripting hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls that are safely scriptable"); if (FAILED(hr)) return FALSE; hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting); if (FAILED(hr)) return FALSE; // register as safe for initializing hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data"); if (FAILED(hr)) return FALSE; hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing); if (FAILED(hr)) return FALSE; //以下是原有的 return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_GOPRINTAX, IDB_GOPRINTAX, afxRegApartmentThreading, _dwGoPrintAXOleMisc, _tlid, _wVerMajor, _wVerMinor); }else{ hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting); if (SUCCEEDED(hr)){ hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing); } //以下是原有的 return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } }
-
成功
- ATL
- 对于ATL来说,要消除该安全提示就是需要将标记控件为安全的,也就是要实现IObjectSafety这个类。
- 在公有继承中添加 public IObjectSafetyImpl<CGoPrintExe(ATL类名), INTERFACESAFE_FOR_UNTRUSTED_CALLER> 继承。
- 在消息队列中添加
BEGIN_COM_MAP(CGoPrintExe) COM_INTERFACE_ENTRY(IObjectSafety)//添加 END_COM_MAP()
- 如果IObjectSafetyImpl 未定义, 则需包含Atlctl.h
- 成功