별도의 설명이 없어도 아래의 소스를 보면 뭐하는놈은지 딱 보인다.

바이너리 파일의 속성창에 버전 정보를 불러오는 소스다.

아래 주석중 //버전정보에 있는 노랗게 표시된 문자열에 FileVersion 대신 다른 값을 넣으면 그 값을

가져올수 있다.


double GetFileVerSion()
{
 BYTE *block;
 DWORD FAR *translation;
 DWORD FAR *buffer;
 DWORD handle;
 UINT bytes;

 CString strPath(GetFilePath());
 
 TCHAR *lpszFileName = (LPTSTR)(LPCTSTR)strPath;
 TCHAR name[512];
 TCHAR data[256];
 CString szString, strVersion[4];
 double dversion = 0;
 
 // 버전 정보의 실제 크기를 가져온다.
 bytes = (UINT)GetFileVersionInfoSize( lpszFileName, &handle);
 
 if(bytes)
 {
  block = new BYTE[bytes];
  
  // 버전 정보에 대한 실제 블록을 가져온다.
  if( GetFileVersionInfo( lpszFileName, handle, bytes, block) )
  {
   if( VerQueryValue( block, _T("\\VarFileInfo\\Translation"), (LPVOID *)&translation,
    (UINT FAR *)&bytes) )
   {
    
    // 버전 정보
    wsprintf(name, _T("\\StringFileInfo\\%04x%04x\\FileVersion"),
     LOWORD(*translation), HIWORD(*translation) );
    
    if( VerQueryValue(block, name, (LPVOID *)&buffer, (UINT FAR *)&bytes) )
    {
     szString.Format(_T("%s"), (LPCTSTR)buffer );
     
     for(int i = 0;  i < 4; i++)
     {
      AfxExtractSubString(strVersion[i], szString, i, ',');
      strVersion[i].TrimLeft(" "); strVersion[i].TrimRight(" ");
     }
     szString.Format(_T("%s%s%s%s"), strVersion[0], strVersion[1], strVersion[2], strVersion[3]);
     dversion = atof(szString);

    }
    else
     szString.Format(_T("Unable to get Version Info"), data);
   }
   else
    szString.Format( _T("(Unable to get translation type)") );
  }
  else
   szString.Format( _T("(Unable to get FileVersionInfo)") );
  
  delete [] block;
 }
 else
 {
  szString.Format( _T("(Unable to get FileVersionInfo size)") );
 }

 return dversion;
}

신고
Posted by 노벰버레인

정규 표현식은 책으로도 1권 될 정도로 분량도 많고 복잡하기도 하고 나에겐 매우 어렵다..ㅡ,.ㅡ;

그래서 네이년한테 물어봤더니 쫘~~~~악~~ 그것도 한글로 나오는데 읽어도 읽어도 당췌 뭔소린지

알수가 없다...ㅡ,.ㅡ;;;; 고로 거창하게는 아니고 그냥 프로젝트하다가 적용한 사례 정도만 나중에 혹시

사용할일이 있지 않을까해서 정리해논다(사실 정리 안됨..ㅡ,.ㅡ;;)

본인은 C, C++이 주 언어지만(그렇다고 절대로!! 잘하는건 아님) C#코드로 구현했기 때문에
 
개발자답게(?) 고대로 Copy & Paste와 간단한 설명을 남긴다.

참고로 C#인지 닷넷인지뭔지 몰라도 이놈은 정규식을 완벽히 지원한단다.


using System.Text.RegularExpressions

bool IsVaildStr(string strText)
{
     string Pattern = @"^[a-zA-Z0-9가-힣]*$";
     return Regex.IsMatch(strText, Pattern);
}

간단히 설명하자면 strText의 문자열이 대-소문자 알파벳, 숫자, 한글인지를 체크하는 정규식이다
유저 계정 만들때 사용한 정규식인데 아이디에 특수문자를 사용할수 없게끔하는 식이다
특이하게 한글이 들어간 이유는 모 포탈 사이트에서는(한게임인가로 기억됨...아님 말고...^^)
한글 계정도 지원한다기에 그냥 넣어봤다

자세한 내용은 아래 설명 참조!


※ 정규식 설명 

^
입력의 시작 위치를 의미한다. 여러 줄 모드에서는 줄바꿈 뒤도 의미한다
/^A/
"An A"에서 시작 위치 바로 뒤의 A는 일치하지만 마지막의 A는 일치하지 않는다. 
^[a-z]
 첫 글자는 반드시 소문자 a-z 사이의 문자를 뜻한다

$
입력의 마지막 위치를 의미한다. 여러 줄 모드에서는 줄바꿈 앞도 의미한다.
/a$/
"Cocoa"에서 마지막에 있는 'a'와 일치한다.
[a-z]$
마지막 글자는 반드시 소문자 a-z사이의 문자를 뜻한다

*
* 앞의 문자가 0번 이상 반복됨을 의미한다.

선택 기호: "|" 기호는 여러 식 중에서 하나를 선택한다.
 "abc|adc"는 abc라는 문자열과 adc라는 문자열을 모두 포함한다.

묶기 기호: (와 )로 여러 식을 하나로 묶을 수 있다.
 "abc|adc"와 "a(b|d)c"는 같은 의미를 가진다.

[] : [과 ] 사이의 문자 중 하나를 선택한다. "|"를 여러 개 쓴 것과 같은 의미를 가진다. 
[abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 문자의 범위를 지정할 수 있다.
[a-z]는 a부터 z까지 중 하나, [1-9]는 1부터 9까지 중의 하나를 뜻한다.

[^] : [^과 ]  사이의 문자를 제외한 나머지 하나를 선택한다. 
[^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다.
[^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 나타낸다.


※ POSIX 문자 그룹(character Classes)

  • [:lower:]   : 소문자 알파벳 문자
  • [:upper:]   : 대문자 알파벳 문자
  • [:digit:]     : 숫자(Numeric digits)
  • [:alnum:]   : 숫자와문자(alphanumeric 문자)
  • [:space:]  : 공백문자(carriage return, newline, vetical tab, form feed)
  • [:punct:]   : 구두점(Punctuation 문자)
  • [:cntl:]     : control 문자
  • [:print:]    : Printable 문자
  • 신고
    Posted by 노벰버레인
    TAG C#, 정규식


    티스토리 툴바