我的代码如下,对于大多数应用程序获得的“描述”是对的,但少量程序获取不到,或获取后是比较奇怪的字符(与“属性”中显示的不一样),好象比较老些的程序容易出现这样的情况。请教比较全面的方法,谢谢!
// 提取应用程序的描述
CString GetAppDescription(CString strAppPath)
{
CString strFileDescription=_T(""); //用来保存应用程序的描述
TCHAR* szFileName =  (LPTSTR)(LPCTSTR)strAppPath;
DWORD dwSize = GetFileVersionInfoSize(szFileName,NULL);
//有些程序这里 dwSize==0, 导致后面会出错
if(dwSize!=0)
{
LPVOID pBlock = malloc(dwSize);
GetFileVersionInfo(szFileName,0,dwSize,pBlock);

TCHAR* pVerValue = NULL;
UINT nSize = 0;
VerQueryValue(pBlock,_T("\\VarFileInfo\\Translation"),
(LPVOID*)&pVerValue,&nSize); //得到 pVerValue nSize //如果是类似于安装包的exe程序,pVerValue的值在这里为NULL,如果继续往下则出错,
//因此应该在这里把这种情况过滤掉
if( pVerValue!=NULL )
{
CString strSubBlock,strTranslation,strTemp;
strTemp.Format(_T("000%x"),*((unsigned short int *)pVerValue));
strTranslation = strTemp.Right(4);
//非unicode的时候,最后一个参数是[2],unicode得改成[1]才对!(不知道为什么)
strTemp.Format(_T("000%x"),*((unsigned short int *)&pVerValue[1]));
strTranslation += strTemp.Right(4);
//strTranslation值:080404b0为中文,040904E4为英文

//文件描述
strSubBlock.Format(_T("\\StringFileInfo\\%s\\FileDescription"),strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
//strTemp.Format("文件描述: %s",pVerValue);
//AfxMessageBox(strTemp);
strFileDescription=pVerValue;
free(pBlock);
}
} return strFileDescription;
}