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 참조 )출처: 데브피아(김병무 님)
댓글
댓글 쓰기