'C, C++' 카테고리의 다른 글
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
---|---|
클래스 win32_file_iterator (0) | 2007.05.11 |
VC+6 아직도 쓴다면... (0) | 2007.05.08 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
---|---|
클래스 win32_file_iterator (0) | 2007.05.11 |
VC+6 아직도 쓴다면... (0) | 2007.05.08 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
좀 연세가 있으신(?) 코더 분들중에는
아직도 Visual C++ 6.0 을 아직도 사용하시는 분들도 있다.
이런 분들을 위한 어드바이스...
1) 서비스 팩을 반드시 받아서 설치하라.
마지막 버전은 서비스 팩 6 이며, 사용 국가 언어에 맞추어 설치하라.
(여기서, MFC42.DLL 은 과연 몇 가지나 될까하는 의문도 생기는데,
결론부터 이야기하자면 천개가 넘는다!!!! DA책 참조...
이점은 배포시에도 주의하도록 해야 한다...)
그리고, 프로세스 팩을 설치한다면 반드시 영문(English)에다가
서비스팩 5 를 설치해야 할 것이다.
2) 플랫폼 SDK 를 활용하라.
이거 안 쓰는 분들 많은데, 꼭 써야 기능과 호환성 문제를 가능한한 극복할 수 있다.
참고로 VC+6 용 플랫폼 SDK 는 현재 최근 버전에서는 지원이 종료되었다.
2003년 2월 버전까지만 지원이 되므로, 그걸로 하도록 하자.
3) WIN64 는 당연히 안 된다.
어쩌겠는가... 미리 준비하지 않은 당신...떠나라~...어디로 가?!?!
4) 유니코드 지원은 최소한 미리 해두자.
VC+2005 부터는 유니코드가 디폴트 설정이다. (왜? WIN98은 공식 지원이 끝난 OS 이므로
MS 에서는 더 지원해줄 필요가 없기 때문이다...비스타까지 나왔는데...왜 허겄는가...)
거기에다가, XP, 비스타 등의 OS 가 기본인 대세에서 유니코드 지원은 피할 수 없다!!!
(미리 포팅하지 않고 중간에 할려면 입에서 단내가 날것이다...ㅋㅋ)
5) VC2005에서는 Secure 관련이 강화되었다.
(이것도 중간 코드를 이식하려면 귀찮고도 짜증나는 일이 될 것이다.
전처리기로 막을 수도 있지만, MS 비권장 사항은 절대로 하지 않는 것이 좋다!!!)
이제 strcpy() 등의 함수는 더 이상 안 키운다...
6) 6 타입 위자드도 못 쓴다.
6 까지는 VC위자드가 바이너리이지만, 그후는 XML 기반이다.
다 뜯어 고치던가...접어라....
7) 매니페스트 처리도 추가하라
8) 6 에서 비스타 관련 지원...
당연히 안 된다!!! 특히 보안 필요한 까탈한 API 호출 시는 GG 쳐라...
9) 결론은 빨리 접어라...
위의 방법들은 어쩔 수 없는 경우의 땜빵 처리들이며, 근원적인 문제 해결은 안 된다.
하지만, 팀원들 중 노땅(?)이나 게으른 이들은 포팅을 거부하기도 할 것이다.
그럴 경우, 최종 지원 플랫폼은 윈 98 이나 2000 으로 하던가...말던가...쩝...
그리고, 가능하면 2003 도 빨리 2005 로 포팅하기를 권한다...
여러분의 사장님은 포팅을 위한 별도의 공수(man-hour)를 할당해 주지는 않을 것이다...
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
클래스 win32_file_iterator (0) | 2007.05.11 |
---|---|
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열
출처 : MSDN 예제>
확장자 myc 를 프호그램에 연결하고 싶은 경우,
resource editor 에서 다음처럼 편집해 본다!!
IDR_MAINFRAME
MyCalc Windows Application\nSheet\nWorksheet\n Worksheets (*.myc)\n.myc\nMyCalcSheet\n MyCalc Worksheet
TTOF2() 함수 (0) | 2007.05.09 |
---|---|
VC+6 아직도 쓴다면... (0) | 2007.05.08 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
VC+6 아직도 쓴다면... (0) | 2007.05.08 |
---|---|
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
CComSafeArray 클래스 (0) | 2007.04.03 |
시스템에서 작동하는 CLR 버전을 인식하고 열거해주는 C++ 클래스
개날역자 j2doll
원문 : http://www.codeproject.com/dotnet/DetectDotNet.asp
source files and release binaries [version 2.2] - 57.5 Kb
개요
CDetectDotNet 클래스는 컴퓨터에 닷넷 프레임워크가 설치되어 있는지를 인식한다. 그리고 현재 설치된 프레임워크 버전들을 보여 준다.
그리고 예측불가하지 않기 위해, 어떤 닷넷에도 의존성이 없는 unmanaged C++클래스이다. 닷넷 프레임웤에서 작동한다면 쓸모없는 것이 될 것이다. (당연하다; 현재 지원 닷넷 프레임워크 버전도 모르는데 어떤 버전의 managed 코드를 작동시킨다는 말인가?!?! 아에 닷넷 프레임워크가 없을 수도 있다.)
필자는 본 클래스가 타겟 머신에 어떤 버전의 닷넷이 설치되어 있는지를 인식하는 것이 필요한 설치 프로그램에서 유용하게 사용될 것이라고 믿는다.
주목해야 할 중요한 점은 닷넷 버전들과 (BCL 과 함께 매칭하는) CLR 버전들이다. 그리고 연계하는 SDK들이 존재하는지의 필요성은 필수적이지는 않다. ; 여기서 주목할 것은 '닷넷 SDK'들과 '닷넷 런타임'들의 차이점이다.
클래스 사용하기
DetectDotNet.h 와 DetectDotNet.cpp 를 사용하려는 프로젝트에 추가한다.
#include "DetectDotNet.h"
// . . .
CDetectDotNet detect;
vector<string> CLRVersions;
cout << "Is .NET present : "
<< (detect.IsDotNetPresent() ? "Yes" : "No") << endl;
TCHAR szPath[300];
cout << "Root Path : "
<< (detect.GetInstallRootPath(szPath, 299) ? szPath : "") << endl;
cout << "Number of CLRs detected : "
<< (int)detect.EnumerateCLRVersions(CLRVersions) << endl;
cout << "CLR versions available :-" << endl;
for(vector<string>::iterator it = CLRVersions.begin();
it < CLRVersions.end(); it++)
{
cout << *it << endl;
}
cout << "Press any key..." << endl;
getch();
예제 출력
Is .NET present : Yes
Root Path : C:\WINDOWS\Microsoft.NET\Framework\
Number of CLRs detected : 2
CLR versions available :-
2.0.50215
1.1.4322
Press any key...
Public 인터페이스
CDetectDotNet 갹체를 생성한다.
반환값 : 시스템에 닷넷 프레임워크가 있는지의 여부를 반환한다. (반환값 : true / false)
닷넷 프레임워크의 설치 루트 경로를 반환한다.
반환값 : 처리 성공 여부에 따라 true 또는 false 를 반환한다.
시스템에 작동하는 CLR 버전들을 열거한다.
반환값 : CLR 버전들의 개수를 반환한다.
구현
.NET 프레임워크 인식하기
필자가 발견한 닷넷 프레임워크의 존재 유무를 알아내는 매우 쉬운 기술은 LoadLibrary "mscoree.dll" 를 하고, 성공 여부를 보는 것이다.
또한 GetProcAddress 로 위치한 DLL 에서 어디에 OS 버전이 있는지의 시나리오들을 감찰하는 "GetCORVersion" 를 읽는 것도 또한 한다.
그리고 (클래스 생성자에서) 결과값을 캐쉬한다, 그리하여 부가적인 호출들이 LoadLibrary/GetProcAddress 호출을 반복하는 필요없다.
bool CDetectDotNet::IsDotNetPresent()
{
return m_bDotNetPresent;
}
bool CDetectDotNet::IsDotNetPresentInternal()
{
bool bRet = false;
//Attempt to LoadLibrary "mscoree.dll" (the CLR EE shim)
HMODULE hModule = LoadLibrary(_T("mscoree"));
if(hModule)
{
//Okay - that worked, but just to ensure that this is
//not a placeholder DLL shipped with some earlier OS versions,
//we attempt to GetProcAddress "GetCORVersion".
bRet = (GetProcAddress(hModule, "GetCORVersion") != NULL);
FreeLibrary(hModule);
}
return bRet;
}
CLR 버전들 열거하기
여기에 필자가 시스템의 사용 가능한 CLR 버전들을 열거하는 원리가 있다.
노트 - mscoree.h 에서GetRequestedRuntimeInfo를 찾을 수 있다. 필자가 이야기한 것은 VS.NET 2005 Beta 2 버전이다.
STDAPI GetRequestedRuntimeInfo(
LPCWSTR pExe, LPCWSTR pwszVersion, LPCWSTR pConfigurationFile,
DWORD startupFlags, DWORD runtimeInfoFlags,
LPWSTR pDirectory, DWORD dwDirectory, DWORD *dwDirectoryLength,
LPWSTR pVersion, DWORD cchBuffer, DWORD* dwlength);
여기에 닷넷 설치 루트 경로의 스크린샷이 있다.
'renamed' 경로 이름을 알아 내자. 사실 설치 경로는 "v2.0.50215" 이다.
pwszVersion 와 함께 GetRequestedRuntimeInfo 의 호출은 "renamed" 를 사실상 성공하도록 설정한다. (왜냐하면 GetRequestedRuntimeInfo 가 필자가 버전을 추출한 기술과 매우 유사한 기술이기 때문이다.) 우습게도 pVersion 에서 반환되는 버전 문자열은 경로의 이름이고, 실제 버전 문자열 이름이 아니다. 하지만 이것은 이 경로 안에 mscorlib.dll 가 있는지를 우리가 알아 내는데 큰 문제가 아니다. 그리고 이 버전 문자열은 포함된 경로의 CLR 버전을 준다.
mscorlib 어셈블리로부터.NET 버전 알아 내기
string CDetectDotNet::GetVersionFromFolderName(string szFolderName)
{
string strRet = "<Version could not be extracted from mscorlib>";
TCHAR szRootPath[g_cPathSize];
if(GetInstallRootPath(szRootPath, g_cPathSize))
{
USES_CONVERSION;
string szFilepath = T2A(szRootPath);
szFilepath += (szFolderName + "\\mscorlib.dll");
string s = GetDotNetVersion(A2CT(szFilepath.c_str()));
if(s.size() > 0)
strRet = s;
}
return strRet;
}
특정 닷넷 버전의 존재 유무 체크하기
[생략]
CLR 버전들의 목록 얻기
size_t CDetectDotNet::EnumerateCLRVersions(vector<string>& CLRVersions)
{
CLRVersions.clear();
USES_CONVERSION;
vector<string> PossibleCLRVersions;
EnumeratePossibleCLRVersionsInternal(PossibleCLRVersions);
for(vector<string>::iterator it = PossibleCLRVersions.begin();
it < PossibleCLRVersions.end(); it++)
{
if(CheckForSpecificCLRVersionInternal(A2CW((*it).c_str())))
{
CLRVersions.push_back(GetVersionFromFolderName(*it));
}
}
return CLRVersions.size();
}
결론
필자는 모든 버전의 윈도와 모든 버전의 닷넷에서 테스트해보지는 못 했다.
따라서 항상 제대로 작동한다고 보장하지는 못 한다.
하지만 귀하에게서 제대로 작동되지 않는다면 필자에게 포럼을 통하여 알려 주기를 바란다.
그리고 만약 귀하가 정확한 문제의 표현을 포스팅하였다면, 필자가 문제를 고치거나 우회하는 노력을 할 것이다. 하지만, 필자가 문제를 수정하는 방법을 알지 못한다면 필자에게 말해 주어야 한다. Enjoy!
History (너무 후다닥 만든거 아니야…-_-;)
그 외 Q&A 리스트
일단… 전반적으로 이러한 방식은'꽁수(not the right way)'이며 정상적인 접근법이 아니라는 의견이 꽤 있다. 하지만, 역자가 보기에는 매우 직관적이며 또한 현실적인 접근법인 듯하다. (뭐랄까… 어떻게 안되겠니?! 라고나 할까나…) 코더에게 뭘 바래…직접 짜든가…된장 찌개 끓이던가…
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
---|---|
GetProcAddress 과 Unicode (0) | 2007.04.14 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
CComSafeArray 클래스 (0) | 2007.04.03 |
visual studio 2005 service pack 1 (0) | 2007.03.25 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
---|---|
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
CComSafeArray 클래스 (0) | 2007.04.03 |
visual studio 2005 service pack 1 (0) | 2007.03.25 |
[VS 인텔리센스 툴] Visual Assist (0) | 2007.03.24 |
SafeArray 를 관리해 주는 클래스 (ATL7)
근데, 문제는 이 친구가 vc+6.0 에서는 없던 녀석이라는 점이다.
따라서, 아직도 쓸데없이 vc6를 고집하는 이들은 이 클래스의 기능을 지원하는 클래스를 본인이 직접 제작하던가, 하는 방식으로 접근해야 한다. 결론은… 새거써…-_-;
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
---|---|
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
visual studio 2005 service pack 1 (0) | 2007.03.25 |
[VS 인텔리센스 툴] Visual Assist (0) | 2007.03.24 |
Codejock XToolkit 2006 (0) | 2007.03.23 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
---|---|
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
CComSafeArray 클래스 (0) | 2007.04.03 |
[VS 인텔리센스 툴] Visual Assist (0) | 2007.03.24 |
Codejock XToolkit 2006 (0) | 2007.03.23 |