z

BLOG ARTICLE 개발/Windows | 16 ARTICLE FOUND

  1. 2006.11.24 IObjectSafety Impl

IObjectSafety Impl

개발/Windows 2006. 11. 24. 13:29


/*
Using MFC
*/
#include "comcat.h"
#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);

len = (len > 127) ? 127 : len;

wcsncpy(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;
}

void UpdateRegistryPatch(CLSID * pClsId)
{

// mark as safe for scripting--failure OK

HRESULT hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls that are safely scriptable");

if (SUCCEEDED(hr))// only register if category exists
 RegisterCLSIDInCategory(*pClsId, CATID_SafeForScripting);

// don"t care if this call fails
// mark as safe for data initialization

hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data");

if (SUCCEEDED(hr))// only register if category exists
 RegisterCLSIDInCategory(*pClsId, CATID_SafeForInitializing);

// don"t care if this call fails
}


/* Call Part
BOOL CCoclassNameCtrl::CCoclassNameCtrlFactory::UpdateRegistry(BOOL bRegister)
{
if (bRegister)
{
 retVal =  AfxOleRegisterControlClass(...)

 //Call Above
 UpdateRegistryPatch(&m_clsid);
}
}
*/

/*
Using ATL
class ATL_NO_VTABLE CCoclassName :
public ICoclassName,
public IObjectSafetyImpl <CCoclassName, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>
*/


AND