본문 바로가기
프로그래밍

👨‍💻 [MFC] MFC 에서 GetFileVersionInfoSize 함수의 헤더 파일은 어떻게 되나요?

by 밝음의기둥 2025. 3. 10.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

MFC 에서 GetFileVersionInfoSize 함수의 헤더 파일은 어떻게 되는지 간략히 알아보았습니다.


질문 >

MFC 에서 GetFileVersionInfoSize 함수의 헤더 파일은 어떻게 되나요?

답변 >

GetFileVersionInfoSize 함수는 Windows API의 버전 정보(Version Information) 관리 함수 중 하나로, VersionHelpers.h 또는 Windows.h 헤더 파일을 포함해야 합니다.

📌 필요한 헤더 파일

#include <windows.h>
#include <VersionHelpers.h>

그러나 대부분의 경우 VersionHelpers.h 없이도 windows.h 만 포함하면 GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue 함수를 사용할 수 있습니다.


🛠 컴파일을 위한 추가 라이브러리

이 API는 Version.lib 라이브러리를 필요로 하므로, 링커 설정에서 해당 라이브러리를 추가해야 합니다.

1. 코드에서 직접 추가:

#pragma comment(lib, "Version.lib")

2. Visual Studio에서 링커 설정 추가:

  • 프로젝트 속성 (Project Properties)
    • 링커 (Linker)입력 (Input)추가 종속성 (Additional Dependencies)
    • "Version.lib" 추가

🎯 최종 예제 (헤더 포함)

#include <windows.h>
#include <tchar.h>
#include <strsafe.h>

#pragma comment(lib, "Version.lib")

void GetProductInfo(LPCTSTR szFilePath)
{
    DWORD dwHandle;
    DWORD dwSize = GetFileVersionInfoSize(szFilePath, &dwHandle);

    if (dwSize == 0)
    {
        _tprintf(_T("GetFileVersionInfoSize failed: %lu\\n"), GetLastError());
        return;
    }

    BYTE* pVersionInfo = new BYTE[dwSize];

    if (!GetFileVersionInfo(szFilePath, 0, dwSize, pVersionInfo))
    {
        _tprintf(_T("GetFileVersionInfo failed: %lu\\n"), GetLastError());
        delete[] pVersionInfo;
        return;
    }

    struct LANGANDCODEPAGE {
        WORD wLanguage;
        WORD wCodePage;
    } *pLangInfo;

    UINT uLen;
    if (!VerQueryValue(pVersionInfo, _T("\\\\VarFileInfo\\\\Translation"), (LPVOID*)&pLangInfo, &uLen))
    {
        _tprintf(_T("VerQueryValue for Translation failed\\n"));
        delete[] pVersionInfo;
        return;
    }

    TCHAR szSubBlock[256];
    StringCchPrintf(szSubBlock, 256, _T("\\\\StringFileInfo\\\\%04x%04x\\\\ProductName"), pLangInfo->wLanguage, pLangInfo->wCodePage);

    LPTSTR szProductName = nullptr;
    if (VerQueryValue(pVersionInfo, szSubBlock, (LPVOID*)&szProductName, &uLen))
    {
        _tprintf(_T("ProductName: %s\\n"), szProductName);
    }

    StringCchPrintf(szSubBlock, 256, _T("\\\\StringFileInfo\\\\%04x%04x\\\\ProductVersion"), pLangInfo->wLanguage, pLangInfo->wCodePage);
    LPTSTR szProductVersion = nullptr;
    if (VerQueryValue(pVersionInfo, szSubBlock, (LPVOID*)&szProductVersion, &uLen))
    {
        _tprintf(_T("ProductVersion: %s\\n"), szProductVersion);
    }

    delete[] pVersionInfo;
}

int main()
{
    TCHAR szFilePath[MAX_PATH];
    GetModuleFileName(NULL, szFilePath, MAX_PATH);

    GetProductInfo(szFilePath);

    return 0;
}

결론

  • 헤더 파일: <windows.h> 포함
  • 라이브러리: "Version.lib" 추가 필요
  • 기능: 실행 파일의 ProductName 및 ProductVersion 가져오기

이제 컴파일하면 정상적으로 실행될 것입니다. 🚀



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형