vc++读取文件属性的详细信息描述 通过读取QQ的注册表和EXE路径两种方式

转载:http://www.cnblogs.com/pythonschool/archive/2012/10/18/2729872.html

// File: GetFileVersion.cpp
// Description: 获取EXE文件的属性详细信息
// Created: 2017-9-5//////////////////////////////////////////////////////////////

/*
The following code shows how to get FILEINFO value from resource file.

These WIN32 functions will be used:

* GetFileVersionInfo
* GetFileVersionInfoSize
* VerQueryValue
* GetModuleFileName
*/

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <string>
#include <iostream>
#include "stdio.h"


#pragma comment(lib, "version.lib")
using namespace std;

std::string GetFileVersion(char * strFilePath) 
{
    DWORD dwSize; 
    DWORD dwRtn; 
    std::string szVersion;  
    //获取版本信息大小
    dwSize = GetFileVersionInfoSize(strFilePath,NULL); 
    if (dwSize == 0) 
    { 
       return ""; 
    }
    char *pBuf; 
    pBuf= new char[dwSize + 1]; 
    if(pBuf == NULL)
       return "";
    memset(pBuf, 0, dwSize + 1);
    //获取版本信息
    dwRtn = GetFileVersionInfo(strFilePath,NULL, dwSize, pBuf); 
    if(dwRtn == 0) 
    { 
       return ""; 
    }
    LPVOID lpBuffer = NULL;
    UINT uLen = 0;
    //版本资源中获取信息
    
dwRtn = VerQueryValue(pBuf, 
   TEXT("\StringFileInfo\080404b0\FileDescription"), //0804中文
   //04b0即1252,ANSI
   //可以从ResourceView中的Version中BlockHeader中看到
   //可以测试的属性
   /*
   CompanyName 
   FileDescription 
   FileVersion 
   InternalName 
   LegalCopyright
   OriginalFilename
   ProductName 
   ProductVersion 
   Comments
   LegalTrademarks 
   PrivateBuild 
   SpecialBuild 
   */         
   &lpBuffer, 
   &uLen); 
if(dwRtn == 0) 
{ 
   return ""; 
}
szVersion = (char*)lpBuffer;
delete pBuf; 
return szVersion; 
}


void main()
{
#define MY_BUFSIZE 500
    HKEY hKey;
    TCHAR szProductType[MY_BUFSIZE];
    DWORD dwBufLen = MY_BUFSIZE;
    LONG lRet;

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        TEXT("SOFTWARE\Tencent\PlatForm_Type_List\3"),
        0,
        KEY_QUERY_VALUE,
        &hKey) == ERROR_SUCCESS)
    {
        lRet = RegQueryValueEx(hKey,
            TEXT("TypePath"),
            NULL,
            NULL,
            (LPBYTE)szProductType,
            &dwBufLen);

        //return szProductType;
    
    }

    RegCloseKey(hKey);

    //char * strFilePath  = "C:\Program Files\Tencent\QQ\Bin\QQ.exe";
    char * strFilePath = szProductType;
    cout << strFilePath << " FileDescription is: " << GetFileVersion(strFilePath) << endl;
    getchar();
}

注:工程默认是多字节编码

原文地址:https://www.cnblogs.com/chechen/p/7477129.html