Visual Studio 2013에서 Visual Basic 6용 ATL Control 제작
이상하군요. Visual Studio 2013에서 생성한 ATL Control의 경우, 해당 컨트롤을 Visual Basic 6의 도구 상자에 구성 요소로 등록 시 로드할 수 없다는 오류가 발생합니다.

'...' could not be loaded.
테스트 삼아서 예전 버전인 Visual Studio 2005에서 ATL Control 프로젝트를 만들어 빌드하면 이런 현상이 없습니다.
차이점을 살펴보면 답이 나오겠지요? ^^ 우선, Visual Studio 2013에서 생성한 ATL 프로젝트의 경우 추가된 컨트롤의 .rgs 파일에 ProgID 관련한 내용이 없습니다. 따라서, 다음의 내용을 수작업으로 추가해 주시면 됩니다.
HKCR
{
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'
}
NoRemove CLSID
{
ForceRemove {A43EF5B0-98B1-4D0B-9444-F6BB987AA37A} = s 'FakeLabel Class'
{
ProgID = s 'TestCtrl.FakeLabel.1'
VersionIndependentProgID = s 'TestCtrl.FakeLabel'
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
val AppID = s '%APPID%'
ForceRemove Control
ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 106'
MiscStatus = s '0'
{
'1' = s '%OLEMISC%'
}
TypeLib = s '{78DF6D83-EE4E-49B0-8C23-EE3E22FCF158}'
Version = s '1.0'
}
}
}
이렇게 해주면 VB 개발환경의 도구 상자 탭에 오류없이 잘 등록이 됩니다. 그런데, 문제가 하나 더 있습니다. 다름 아닌, 도구 상자에서 선택해 VB Form에 얹어 놓을 때 다시 오류가 발생합니다.
System Error &H80004005 (-2147467259).
0x80004005 == Unspecified error
이건 IPersistStreamInit 인터페이스 구현이 없어서 그런 것입니다. 따라서 컨트롤 소스 코드의 헤더 파일에 이와 관련한 인터페이스를 추가해 주면 됩니다.
// ... [생략] ...
class ATL_NO_VTABLE CFakeLabel :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IFakeLabel, &IID_IFakeLabel, &LIBID_TestCtrlLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CFakeLabel>,
public IOleControlImpl<CFakeLabel>,
public IOleObjectImpl<CFakeLabel>,
// ... [생략] ...
{
// ... [생략] ...
BEGIN_COM_MAP(CFakeLabel)
COM_INTERFACE_ENTRY(IFakeLabel)
COM_INTERFACE_ENTRY(IDispatch)
// ... [생략] ...
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
// ... [생략] ...
END_COM_MAP()
// ... [생략] ...
}
그 외에 한가지 더!
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."라는 오류 메시지가 뜨면서 등록이 실패합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]