수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1693825
  • Today | 176
  • Yesterday | 588

Programming/Win32 API2006/12/08 13:06

파일 버전 구해서 비교하기...

고수닷넷 - 데미소다오렌지님

1. GetFileVersion

PE 파일 포맷의 버전을 구하는 함수로 윈도우에서는 GetFileVersionInfo 함수를 지원해 줍니다. 하지만 해당 함수의 사용을 위해서는 다소 복잡한 과정을 거쳐야 합니다. 또한 GetFileVersionInfo의 경우 버전 넘버가 아닌 버전에 관한 모든 정보를 구하는 함수이므로 단순히 버전을 구할때 사용하려면 불편하기도 합니다. 이러한 불편한 점을 한방에 해결해 주는 함수 GetFileVersion 함수를 만들어 보도록 합시다.

우리가 만들 함수는 단순하게 지정된 패스의 버전만 구해내면 됩니다. 따라서 입력 파라미터로는 파일의 패스와 함께 버전 정보가 리턴될 구조체를 사용할 것 입니다. 리턴값으로는 함수의 성공 여부를 BOOL 형태로 리턴하는 것이 좋을 것 같습니다. 이렇게 생각해 낸 함수 원형은 아래와 같습니다.

BOOL GetFileVersion(LPCTSTR lpszFilePath, VS_FIXEDFILEINFO *pvffi);

VS_FIXEDFILEINFO에 관해서 잠시 알아보도록 합시다. VS_FIXEDFILEINFO는 아래와 같이 정의된 구조체입니다.

struct VS_FIXEDFILEINFO {
  DWORD dwSignature;
  DWORD dwStrucVersion;
  DWORD dwFileVersionMS;
  DWORD dwFileVersionLS;
  DWORD dwProductVersionMS;
  DWORD dwProductVersionLS;
  DWORD dwFileFlagsMask;
  DWORD dwFileFlags;
  DWORD dwFileOS;
  DWORD dwFileType;
  DWORD dwFileSubtype;
  DWORD dwFileDateMS;
  DWORD dwFileDateLS;
};



여기서 버전 넘버와 관련된 값은 dwFileVersionMS와 dwFileVersionLS입니다. 각각, 64비트 파일 버전의 상위 32비트와 하위 32비트를 구성하는 값 입니다.

이젠 실제 함수 구현을 한번 살펴보도록 합시다. GetFileVersionInfoSize, GetFileVersionInfo API를 사용하기 위해서는 version.h를 포함시켜야 하며, version.lib를 링크시에 같이 링크시켜 줘야 합니다. GetFileVersionInfoSize는 버전 정보의 크기를 구하는 함수이며, GetFileVersion은 실제 버전 정보를 구하는 함수 입니다. VerQueryValue는 구해진 버전 정보내에서 원하는 부분을 구해내는 함수입니다.

중요한 두가지 부분을 살펴보도록 하겠습니다.

GetFileVersionInfo(lpszFilePath, NULL, dwSize, pByte)

위 라인은 파일의 버전 정보를 구해서 pByte 영역으로 복사해 주는 역할을 합니다.

VerQueryValue(pByte, "\\", (LPVOID*) &pvffi0, &nLen)

위 라인은 구해진 pByte 내에서 위에서 언급한 VS_FIXEDFILEVERSION 부분을 가리키는 영역을 구하는 함수입니다. 여기서 pvffi0는 pByte의 특정 영역을 가리키는 포인터를 리턴합니다. 따라서 pvffi0로는 단순한 포인터의 포인터를 넘기면 됩니다.

#include "version.h"
#pragma comment(lib, "version.lib") 

BOOL GetFileVersion(LPCTSTR lpszFilePath, VS_FIXEDFILEINFO *pvffi)
{
   BOOL                bRet = FALSE;
   DWORD               dwSize;
   BYTE                *pByte;
   VS_FIXEDFILEINFO    *pvffi0;
   UINT                nLen = sizeof *pvffi0;

   dwSize = GetFileVersionInfoSize(lpszFilePath, NULL);

   if(dwSize > 0)
   {
       pByte = new BYTE[dwSize];

       if(GetFileVersionInfo(lpszFilePath, NULL, dwSize, pByte) == TRUE &&
          VerQueryValue(pByte, "\\", (LPVOID*) &pvffi0, &nLen) == TRUE)
       {
           memcpy(pvffi, pvffi0, sizeof *pvffi);
           bRet = TRUE;
       }

       delete [] pByte;
   }

   return bRet;
}

2. CompareVersion

이제 위에서 구한 버전 정보를 실제로 비교하는 함수를 만들어 봅시다. 두개의 버전 정보를 받아서 int형을 리턴하는 함수로 만들어 보겠습니다.

int CompareVersion(VS_FIXEDFILEINFO *a0, VS_FIXEDFILEINFO *a1)

위는 이 함수의 원형입니다. a0, a1을 입력 버전으로 받습니다. 리턴값은 0일 경우 두개의 버전이 동일한 것이며, 0보다 크면 a0가 큰것이고, 0보다 작다면 a0가 작은 것 입니다.

실제 구현을 한번 살펴봅시다. 별로 어려운 코드도 아니며, 특수한 내용이 있는 코드도 아닙니다. 단지 살펴볼만한 부분은 실제 버전 정보가 64비트이기 때문에, 32비트씩 나눠서 비교한다는 것 입니다. 아래와 같이 32비트의 뺄셈을 통해서 비교를 하는 것은 자주 사용되기 때문에 한번쯤 살펴보는 것도 좋겠네요.

int CompareVersion(VS_FIXEDFILEINFO *a0, VS_FIXEDFILEINFO *a1)
{
   int nRet = 0;
   int diffMS, diffLS;

   diffMS = a1->dwFileVersionMS - a0->dwFileVersionMS;
   diffLS = a1->dwFileVersionLS - a0->dwFileVersionLS;

   if(diffMS == 0)
       nRet = diffLS;
   else
       nRet = diffMS;

   return nRet;
}

3. 테스트

이제껏 디자인한 함수를 사용해 보도록 하겠습니다. 아래는 system32에 있는 kernel32.dll과 gdi32.dll의 버전 정보를 비교하는 방법을 보여줍니다.

VS_FIXEDFILEINFO a0;
VS_FIXEDFILEINFO a1;

GetFileVersion("c:\\winnt\\system32\\kernel32.dll", &a0);
GetFileVersion("c:\\winnt\\system32\\gdi32.dll", &a1);

if(CompareVersion(&a0, &a1) > 0)
   AfxMessageBox("new");
else
   AfxMessageBox("older or same");
"Win32 API" 카테고리의 다른 글
  • 시스템 트레이 사용하기 (0)2006/12/29
  • 메모리 오류 (0)2006/12/27
  • 파일 버전 구해서 비교하기... (0)2006/12/08
  • 재밌는 시스템 강제로 다운시키기 (0)2006/12/08
  • CDROM Insertion/Removal 감지하기 (0)2006/12/05
2006/12/08 13:06 2006/12/08 13:06
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2477

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 762 763 764 765 766 767 768 769 770 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Named
  • 집현관
  • 노틀담
  • IIS7
  • 스키점프
  • 행정본관
  • 프로세스 모델링
  • Business Intelligence
  • 목표
  • 운영체제
  • URL Redirect
  • BI
  • ASCII Character Codes
  • 영화
  • Safari3
  • 매크로
  • 빠에야
  • FlashWindow
  • eCommerce
  • 영어

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.