【WIN】【C++】查询文件信息(公司、版本、版权、描述、厂商等)

39 篇文章 6 订阅

使用C++提供的一个查询文件信息的接口,实现接口为 QueryValue

fileInfo.h

class FileInfoUtils
{
public:
	static bool GetFileDescription(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"FileDescription",szModuleName,RetStr);}
	static bool	GetFileVersion(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"FileVersion",szModuleName,RetStr);}
	static bool	GetInternalName(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"InternalName",szModuleName,RetStr);}
	static bool	GetCompanyName(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"CompanyName",szModuleName,RetStr);}
	static bool	GetLegalCopyright(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"LegalCopyright",szModuleName,RetStr);}
	static bool	GetOriginalFilename(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"OriginalFilename",szModuleName,RetStr);}
	static bool	GetProductName(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"ProductName",szModuleName,RetStr);}
	static bool	GetProductVersion(const std::wstring& szModuleName, std::wstring& RetStr) {return QueryValue(L"ProductVersion",szModuleName,RetStr);}

private:
	static bool QueryValue(const std::wstring wsValueName, const std::wstring wsModuleName, std::wstring &wsRetStr);
};

fileInfo.cpp


bool FileInfoUtils::QueryValue(const std::wstring wsValueName, const std::wstring wsModuleName, std::wstring &wsRetStr)
{
	bool bSuccess = FALSE;
	BYTE *lpVersionData = NULL;
	DWORD  dwLangCharset = 0;
	TCHAR *pStr = NULL;

	do
	{
		if ( wsValueName.empty() || wsModuleName.empty() )
			break;

		DWORD dwHandle;
		// 判断系统能否检索到指定文件的版本信息
		DWORD dwDataSize = ::GetFileVersionInfoSize((LPCWSTR)wsModuleName.c_str(), &dwHandle);
		if (dwDataSize == 0)
			break;

		lpVersionData = new (std::nothrow) BYTE[dwDataSize];// 分配缓冲区
		if ( NULL == lpVersionData)
			break;

		// 检索信息
		if (!::GetFileVersionInfo((LPCWSTR)wsModuleName.c_str(), dwHandle, dwDataSize, (void*)lpVersionData))
			break;

		UINT nQuerySize;
		DWORD *pTransTable;
		// 设置语言
		if ( !::VerQueryValue(lpVersionData, L"\\VarFileInfo\\Translation", (void **)&pTransTable, &nQuerySize))
			break;

		dwLangCharset = MAKELONG(HIWORD(pTransTable[0]), LOWORD(pTransTable[0]));
		if (lpVersionData == NULL)
			break;

		pStr = new (std::nothrow) TCHAR[128];// 分配缓冲区
		if (NULL == pStr)
			break;

		//wchar_t str2[MAX_PATH];
		//wcscpy_s(str2, MAX_PATH, wsValueName.c_str());
		swprintf_s(pStr, 128, L"\\StringFileInfo\\%08lx\\%s", dwLangCharset, wsValueName.c_str());

		LPVOID lpData;

		// 调用此函数查询前需要先依次调用函数GetFileVersionInfoSize和GetFileVersionInfo
		if (::VerQueryValue((void *)lpVersionData, pStr, &lpData, &nQuerySize))
			wsRetStr = (TCHAR *)lpData;

		bSuccess = TRUE;

	} while (FALSE);

	// 销毁缓冲区
	if (lpVersionData)
	{
		delete[] lpVersionData;
		lpVersionData = NULL;
	}
	if (pStr)
	{
		delete[] pStr;
		pStr = NULL;
	}

	return bSuccess;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值