'C#' 카테고리의 다른 글
c# ref (0) | 2007.06.19 |
---|---|
c# foreach 예제 (0) | 2007.06.13 |
Inside C# 예제 파일 (0) | 2007.06.12 |
줄번호 넣기 (Adding line numbers to text) C# (0) | 2007.06.08 |
c# ref (0) | 2007.06.19 |
---|---|
c# foreach 예제 (0) | 2007.06.13 |
Inside C# 예제 파일 (0) | 2007.06.12 |
줄번호 넣기 (Adding line numbers to text) C# (0) | 2007.06.08 |
시스템에서 작동하는 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 |
FAQ : Visual Studio 와 Windows Vista - (1) (0) | 2007.07.19 |
---|---|
OpenSSH for Windows 설치 (0) | 2007.07.09 |
인터넷에서 사용할 수 있는 SNTP(단일 네트워크 기간 프로토콜) 시간 서버 목록 (0) | 2007.06.15 |
[꽁수] TrustedInstaller.exe 와 CPU 점유율 100% (0) | 2007.06.09 |
[반투명 작업 표시줄] TransBar (1) | 2007.03.25 |
IEBNTracker
분석 사용 예1>> naver.com 에서 helloworld 를 검색할 경우의 URL
http://search.naver.com/search.naver?where=nexearch&query=helloworld&frm=t1&sm=top_hty
분석 사용 예2>> dreamwiz.com 의 로그인 처리 분석
URL
https://login.dreamwiz.com/BIN/login.cgi
PostData
url=&url_home=http%3A%2F%2Fwww.dreamwiz.com&url_premium=http%3A%2F%2Fmail.dreamwiz.com%2FAUTH%2Fmail.cgi%3Fc%3DT&secure=2&id=아이디&pw=암호
Headers
Content-Type: application/x-www-form-urlencoded
https 프로토콜을 사용하여 암호화처리가 됨을 알 수 있다.
포스트 값에 아이디 암호가 있지만, 일반 스니핑으로는 당연히 알수 없다. (안전한 로그인 확인)
그리고, 광고가 많은 싸이트에서 어떤 광고를 링크했는지도 쉽게 알 수 있습니다. 필요시 adblock 등의 브라우저 애드온 기능으로 광고를 막는 기능을 수행하실 수 있습니다.
중저가형 웹시스템의 경우에 보안 처리가 허술한 경우가 꽤 있습니다.
물론, 웹 보안 + 윈도 보안 지원 툴(백신, 보안 라이브러리 등) 도 당연히 필수로 필요한 세상입니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
URLDownload - URL로 파일 다운로드 (0) | 2008.12.01 |
---|---|
[유틸][윈도우즈] UTC/GMT/KST 시간 변환: ConverT, TC-1 (0) | 2008.02.26 |
[DisplayVersionOnDesktop] 바탕 화면에 윈도우 버전 표시하기 (0) | 2007.07.03 |
[ConvertU] UTF-8 과 URL 인코딩 동시 변환 유틸리티 (10) | 2007.06.26 |
[시간 정보 수정/비교][NTP/SNTP] TinyTimeSync (0) | 2007.03.23 |
FAQ : Visual Studio 와 Windows Vista - (1) (0) | 2007.07.19 |
---|---|
OpenSSH for Windows 설치 (0) | 2007.07.09 |
인터넷에서 사용할 수 있는 SNTP(단일 네트워크 기간 프로토콜) 시간 서버 목록 (0) | 2007.06.15 |
[꽁수] TrustedInstaller.exe 와 CPU 점유율 100% (0) | 2007.06.09 |
디버그 폴더 모두 지우기 배치/커맨드 파일 예제 (0) | 2007.03.28 |
.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 |