MFC 위저드로 만든 컨트롤을 등록하고 Explore에서 참조하려면 계속 보안 경고창이 떠서 귀찮게 합니다.
익스플로어의 인터넷 옵션의 "보안"의 "이 영역에 적용할 보안수준"부분을
"최소"로 변경하면 해결되지만 그러면 신뢰할 수 없는 사이트에 들어가도
경고를 하지 않으므로 추천할 만한 방법은 아닙니다.
이 문제는 소스차원에서 해결이 가능한 부분으로 아래의 함수를 약간만 수정하면 됩니다.
위저드로 만든 소스를 찾아보면 UpdateRegistry(...)함수가 있을 겁니다.
안에 포함된 내용을 보시면 대략 다음과 같이 되어 있을 겁니다.
이 부분을 아래처럼 변경하시면 됩니다.
여기에 사용되는 함수는 다음과 같습니다.
그런데 else부분에서 아마도 이렇게 돼어있었던듯해서 추가합니다.
이외에도 컴포넌트 카테고리에는
출처: 데브피아(김병무 님)
익스플로어의 인터넷 옵션의 "보안"의 "이 영역에 적용할 보안수준"부분을
"최소"로 변경하면 해결되지만 그러면 신뢰할 수 없는 사이트에 들어가도
경고를 하지 않으므로 추천할 만한 방법은 아닙니다.
이 문제는 소스차원에서 해결이 가능한 부분으로 아래의 함수를 약간만 수정하면 됩니다.
위저드로 만든 소스를 찾아보면 UpdateRegistry(...)함수가 있을 겁니다.
안에 포함된 내용을 보시면 대략 다음과 같이 되어 있을 겁니다.
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_TESTCTRL, --> 프로그램마다 다름
IDB_TESTCTRL, --> 프로그램마다 다름
afxRegApartmentThreading,
_dwTestCtrlOleMisc, --> 프로그램마다 다름
_tlid,
_wVerMajor,
_wVerMinor);
이 부분을 아래처럼 변경하시면 됩니다.
if(bRegister)
{
BOOL retval = AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_TESTCTRL,
IDB_TESTCTRL,
afxRegApartmentThreading,
_dwTestCtrlOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
// 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(m_clsid, 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(m_clsid, CATID_SafeForInitializing);
// don"t care if this call fails
return retval;
}
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
여기에 사용되는 함수는 다음과 같습니다.
#include "comcat.h"
#include "objsafe.h"
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ; // interface pointer
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(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;
}
[추가]
책에서 본듯한 내용이군여...그런데 else부분에서 아마도 이렇게 돼어있었던듯해서 추가합니다.
UpdateRegistry(...)
{
if( bRegister )
{
...
}
else
{
UnregisterCLSIDInCategory( m_clsid, CATID_SafeForInitializing );
UnregisterCLSIDInCategory( m_clsid, CATID_SafeForScripting );
return AfxOleUnregisterClass( m_clsid, m_lpszProgID );
}
}
여기서 UnregisterCLSIDInCategory함수는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) )
{
CATID rgcatid[1];
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories( clsid, 1, rgcatid );
}
if( pcr != NULL )
pcr->Release();
return hr;
}
이외에도 컴포넌트 카테고리에는
CATID_PersistsToMoniker,
CATID_PersistsToStreamInit,
CATID_PersistsToStream,
CATID_PersistsToStorage,
CATID_PersistsToMemory,
CATID_PersistsToFile,
CATID_PersistsToPropertyBag,
CATID_ReguiresDataPathHost,
CATID_InternetAware
등의 인터넷특성적인 컴포넌트 카테고리를 지원합니다. ( comcat.h 참조 )출처: 데브피아(김병무 님)
댓글
댓글 쓰기