获得文件属性

#include "string"
using namespace std;
typedef struct stFilePro 
{
	wstring strComments;
	wstring strProductName;
	wstring strInternalName;
	wstring strProductVersion;
	wstring strSpecialBuild;
}STFILEPRO, *pSTFILEPRO;

BOOL GetFileProperty(wchar_t* wcFilPath, STFILEPRO& stFilePro)
{
	//Language code struct.
	struct LANGANDCODEPAGE 
	{
		WORD wLanguage;
		WORD wCodePage;
	} *TranslationPtr;

	DWORD    dwSize     = 0;
	BOOL     bRet       = TRUE;
	BOOL     bTmpRet    = FALSE;
	UINT     uInfoSize  = 0;
	LPVOID   infoPtr    = NULL;
	wchar_t* pVerInfo   = NULL;

	//Get version info size.
	dwSize = GetFileVersionInfoSize(wcFilPath, NULL);

	LPVOID pInfoData = malloc(dwSize);

	if ( dwSize > 0 )
	{
		//Get Version info.
		bTmpRet = GetFileVersionInfo(wcFilPath, NULL, dwSize, pInfoData);

		if ( bTmpRet )
		{
			//Get language code.
			bTmpRet = VerQueryValue(pInfoData, L"\\VarFileInfo\\Translation", (LPVOID*)&TranslationPtr, &uInfoSize);
			
			if ( bTmpRet )
			{
				wchar_t wcCommentsInfo[100]         = {0};
				wchar_t wcProductNameInfo[100]      = {0};
				wchar_t wcProductVersionInfo[100]   = {0};
				wchar_t wcInternalNameInfo[100]     = {0};
				wchar_t wcSpecialBuildInfo[100]     = {0};

				//Format string.
				wsprintf(wcProductNameInfo, 	 L"\\StringFileInfo\\%04x%04x\\ProductName",		TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage);
				wsprintf(wcProductVersionInfo,	 L"\\StringFileInfo\\%04x%04x\\ProductVersion",		TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage);
				wsprintf(wcInternalNameInfo,	 L"\\StringFileInfo\\%04x%04x\\InternalName",		TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage);
				wsprintf(wcCommentsInfo,         L"\\StringFileInfo\\%04x%04x\\Comments",			TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage);
				wsprintf(wcSpecialBuildInfo,	 L"\\StringFileInfo\\%04x%04x\\SpecialBuild",		TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage);

				//Get comments.
				bTmpRet = VerQueryValue(pInfoData, wcCommentsInfo, (LPVOID*)&infoPtr, &uInfoSize);
				if ( !bTmpRet )
				{
					//bRet = FALSE;
				}
				else
				{
					pVerInfo = (wchar_t*)infoPtr;
					stFilePro.strComments = pVerInfo;
					infoPtr = NULL;
				}

				//Get internalname.
				bTmpRet = VerQueryValue(pInfoData, wcInternalNameInfo, (LPVOID*)&infoPtr, &uInfoSize);
				if ( !bTmpRet )
				{
					//bRet = FALSE;
				}
				else
				{
					pVerInfo = (wchar_t*)infoPtr;
					stFilePro.strInternalName = pVerInfo;
					infoPtr = NULL;
				}

				//Get productname.
				bTmpRet = VerQueryValue(pInfoData, wcProductNameInfo, (LPVOID*)&infoPtr, &uInfoSize);
				if ( !bTmpRet )
				{
					//bRet = FALSE;
				}
				else
				{
					pVerInfo = (wchar_t*)infoPtr;
					stFilePro.strProductName = pVerInfo;
					infoPtr = NULL;
				}

				//Get productversion.
				bTmpRet = VerQueryValue(pInfoData, wcProductVersionInfo, (LPVOID*)&infoPtr, &uInfoSize);
				if ( !bTmpRet )
				{
					//bRet = FALSE;
				}
				else
				{
					pVerInfo = (wchar_t*)infoPtr;
					stFilePro.strProductVersion = pVerInfo;
					infoPtr = NULL;
				}

				//Get specialbuild.
				bTmpRet = VerQueryValue(pInfoData, wcSpecialBuildInfo, (LPVOID*)&infoPtr, &uInfoSize);
				if ( !bTmpRet )
				{
					//bRet = FALSE;
				}
				else
				{
					pVerInfo = (wchar_t*)infoPtr;
					stFilePro.strSpecialBuild = pVerInfo;
					infoPtr = NULL;
				}
			}
			else
			{
				bRet = FALSE;
			}
		}
		else
		{
			bRet = FALSE;
		}
	}
	else
	{
		bRet = FALSE;
	}
	free(pInfoData);
	pInfoData = NULL;
	return bRet;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值