#include<Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "version.lib")
//获取文件默认打开的应用程序路径
DWORD size = 0;
CString str;
HRESULT hr = ::AssocQueryString(ASSOCF_NOFIXUPS | ASSOCF_VERIFY, ASSOCSTR_EXECUTABLE, L".cxp", NULL, NULL, &size);
if (hr == S_FALSE)
{
wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(size));
hr = ::AssocQueryString(ASSOCF_NOFIXUPS | ASSOCF_VERIFY, ASSOCSTR_EXECUTABLE, L".cxp", NULL, wcstring, &size);
DWORD dwMinSize = 0;
LPSTR lpszStr = NULL;
dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, wcstring, -1, NULL, 0, NULL, FALSE);
if (0 == dwMinSize)
{
}
lpszStr = new char[dwMinSize];
WideCharToMultiByte(CP_OEMCP, NULL, wcstring, -1, lpszStr, dwMinSize, NULL, FALSE);
str = lpszStr;
delete[] lpszStr;
if (hr == S_OK)
{
}
}
DWORD dwSize = GetFileVersionInfoSize(str, NULL);
if (dwSize != 0)
{
UINT nSize = dwSize * sizeof(TCHAR);
LPVOID pBlock = new TCHAR[nSize];
memset(pBlock, 0, nSize);
GetFileVersionInfo(str, 0, dwSize, pBlock);
char* pVerValue = NULL;
UINT pBufLen = 0;
VerQueryValue(pBlock, _T("\\VarFileInfo\\Translation"),
(LPVOID*)&pVerValue, &pBufLen);
CString strSubBlock, strTranslation, strTemp;
strTemp.Format(_T("000%x"), *((unsigned short int *)pVerValue));
strTranslation = strTemp.Right(4);
strTemp.Format(_T("000%x"), *((unsigned short int *)&pVerValue[2]));
strTranslation += strTemp.Right(4);
//文件描述
strSubBlock.Format(_T("\\StringFileInfo\\%s\\FileDescription"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("文件描述: %s"), pVerValue);
//内部名称
strSubBlock.Format(_T("\\StringFileInfo\\%s\\InternalName"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("文件描述: %s"), pVerValue);
//合法版权
strSubBlock.Format(_T("\\StringFileInfo\\%s\\LegalTradeMarks"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("合法版权: %s"), pVerValue);
//原始文件名
strSubBlock.Format(_T("\\StringFileInfo\\%s\\OriginalFileName"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("原始文件名: %s"), pVerValue);
//产品名称
strSubBlock.Format(_T("\\StringFileInfo\\%s\\ProductName"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("产品名称: %s"), pVerValue);
//产品版本
strSubBlock.Format(_T("\\StringFileInfo\\%s\\ProductVersion"), strTranslation);
VerQueryValue(pBlock, strSubBlock.GetBufferSetLength(256), (LPVOID*)&pVerValue, &nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(_T("产品版本: %s"), pVerValue);
delete[] pBlock;
}