성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[tree soap] 아차! f는 기억이 나는데, m은 ㅜㅜ 감사합니다!!! ^...
[정성태] 'm'은 decimal 타입의 숫자에 붙는 접미사입니다. ...
[정성태] https://lxr.sourceforge.io/ http...
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Visual Studio 2013에서 Visual Basic 6용 ATL Control 제작</h1> <p> 이상하군요. Visual Studio 2013에서 생성한 ATL Control의 경우, 해당 컨트롤을 Visual Basic 6의 도구 상자에 구성 요소로 등록 시 로드할 수 없다는 오류가 발생합니다.<br /> <br /> <img alt='vb6_with_vs2013_1.png' src='/SysWebRes/bbs/vb6_with_vs2013_1.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > '...' could not be loaded. </pre> <br /> 테스트 삼아서 예전 버전인 Visual Studio 2005에서 ATL Control 프로젝트를 만들어 빌드하면 이런 현상이 없습니다.<br /> <br /> 차이점을 살펴보면 답이 나오겠지요? ^^ 우선, Visual Studio 2013에서 생성한 ATL 프로젝트의 경우 추가된 컨트롤의 .rgs 파일에 ProgID 관련한 내용이 없습니다. 따라서, 다음의 내용을 수작업으로 추가해 주시면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HKCR { <span style='color: blue; font-weight: bold'> TestCtrl.FakeLabel.1 = s 'FakeLabel Class' { CLSID = s '{A43EF5B0-98B1-4D0B-9444-F6BB987AA37A}' } TestCtrl.FakeLabel = s 'FakeLabel Class' { CLSID = s '{A43EF5B0-98B1-4D0B-9444-F6BB987AA37A}' CurVer = s 'TestCtrl.FakeLabel.1' }</span> NoRemove CLSID { ForceRemove {A43EF5B0-98B1-4D0B-9444-F6BB987AA37A} = s 'FakeLabel Class' { <span style='color: blue; font-weight: bold'>ProgID = s 'TestCtrl.FakeLabel.1' VersionIndependentProgID = s 'TestCtrl.FakeLabel'</span> ForceRemove Programmable InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } <span style='color: blue; font-weight: bold'>val AppID = s '%APPID%'</span> ForceRemove Control ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 106' MiscStatus = s '0' { '1' = s '%OLEMISC%' } TypeLib = s '{78DF6D83-EE4E-49B0-8C23-EE3E22FCF158}' Version = s '1.0' } } } </pre> <br /> 이렇게 해주면 VB 개발환경의 도구 상자 탭에 오류없이 잘 등록이 됩니다. 그런데, 문제가 하나 더 있습니다. 다름 아닌, 도구 상자에서 선택해 VB Form에 얹어 놓을 때 다시 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System Error &H80004005 (-2147467259). 0x80004005 == Unspecified error </pre> <br /> 이건 IPersistStreamInit 인터페이스 구현이 없어서 그런 것입니다. 따라서 컨트롤 소스 코드의 헤더 파일에 이와 관련한 인터페이스를 추가해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // ... [생략] ... class ATL_NO_VTABLE CFakeLabel : public CComObjectRootEx<CComSingleThreadModel>, public IDispatchImpl<IFakeLabel, &IID_IFakeLabel, &LIBID_TestCtrlLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, <span style='color: blue; font-weight: bold'>public IPersistStreamInitImpl<CFakeLabel>,</span> public IOleControlImpl<CFakeLabel>, public IOleObjectImpl<CFakeLabel>, // ... [생략] ... { // ... [생략] ... BEGIN_COM_MAP(CFakeLabel) COM_INTERFACE_ENTRY(IFakeLabel) COM_INTERFACE_ENTRY(IDispatch) // ... [생략] ... COM_INTERFACE_ENTRY(IOleObject) <span style='color: blue; font-weight: bold'>COM_INTERFACE_ENTRY(IPersistStreamInit) COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)</span> COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IConnectionPointContainer) // ... [생략] ... END_COM_MAP() // ... [생략] ... } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그 외에 한가지 더!<br /> <br /> Visual Studio 2013의 Visual C++ 프로젝트의 경우 "Platform Toolset"의 기본 값이 "Visual Studio 2013 (v120)"로 되어 있는데요. 대개의 경우, Visual Basic 6 응용 프로그램을 아직도 쓰는 곳이라면 XP 이하의 버전일 가능성이 큽니다. 따라서, "Platform Toolset" 값을 "Visual Studio 2013 - Windows XP (v120_xp)"로 바꿔주는 것이 안전합니다. 그렇지 않으면 Windows Server XP/2003에서 regsvr32.exe로 등록 시 "LoadLibrary(...) failed - The specified procedure could not be found."라는 오류 메시지가 뜨면서 등록이 실패합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1429
(왼쪽의 숫자를 입력해야 합니다.)