struct progress
{
char strFullPath[
256];
//程序绝对路径
char strSoftwareName[
256];
//软件名称
char strSoftwareVersion[
256];
//软件版本号
char strSoftwareVendors[
256];
//软件厂商
char strStratTime[
16];
//201509251313,软件启动时间,当时间为“”则表示软件当前未启动
unsigned iStartCount;
//软件启动次数
unsigned iRunintTotalTime;
//软件运行总时间
};
void GetInfoFromExeAndDll(progress &
proItem)
{
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
};
DWORD dwSize =
0;
UINT uiSize = GetFileVersionInfoSize(proItem.strFullPath, &
dwSize);
if (
0 ==
uiSize)
{
return;
}
PTSTR pBuffer =
new TCHAR[uiSize];
if (NULL ==
pBuffer)
{
return;
}
memset((void*)pBuffer,
0, uiSize);
//获取exe 或 DLL 的资源信息,存放在pBuffer内
if (!GetFileVersionInfo(proItem.strFullPath,
0, uiSize, (PVOID)pBuffer))
{
return;
}
LANGANDCODEPAGE *pLanguage = NULL;
//这里这样设置没关系了。
UINT uiOtherSize =
0;
//获取资源相关的 codepage 和language
if (!VerQueryValue(pBuffer,
"\\VarFileInfo\\Translation",(PVOID*)&pLanguage, &
uiOtherSize))
{
return;
}
//重点
char* pTmp =
NULL;
TCHAR SubBlock[MAX_PATH];
memset((void*)SubBlock,
0,
sizeof(SubBlock));
UINT uLen =
0;
//获取每种 CodePage 和 Language 资源的相关信息 //这个地方原本是用for循环获取每一种CodePage 和 Language,但是获取了他的长度后发现,长度太短了,而我们想要获取的东西却又比较多,经过测试,只使用第一组数据即可 //在字符串格式化的\\最后一个字符串的名称就是我们想要获取的属性名称,它们可以是 /*
CompanyName
FileDescription
FileVersion
InternalName
LegalCopyright
OriginalFilename
ProductName
ProductVersion
Comments
LegalTrademarks
PrivateBuild
SpecialBuild
*/
int ret = uiOtherSize /
sizeof(LANGANDCODEPAGE);
if (ret >
0)
{
wsprintf(SubBlock,TEXT("\\StringFileInfo\\xx\\ProductName"),pLanguage[
0].wLanguage,pLanguage[
0].wCodePage);
if (VerQueryValue(pBuffer, SubBlock, (PVOID*)&pTmp, &
uLen))
{
if (strlen(pTmp)>
0)
strcpy_s(proItem.strSoftwareName, pTmp);
}
wsprintf(SubBlock, TEXT("\\StringFileInfo\\xx\\CompanyName"), pLanguage[
0].wLanguage, pLanguage[
0].wCodePage);
if(VerQueryValue(pBuffer, SubBlock, (PVOID*)&pTmp, &
uLen))
strcpy_s(proItem.strSoftwareVendors, pTmp);
wsprintf(SubBlock, TEXT("\\StringFileInfo\\xx\\FileVersion"), pLanguage[
0].wLanguage, pLanguage[
0].wCodePage);
if(VerQueryValue(pBuffer, SubBlock, (PVOID*)&pTmp, &
uLen))
strcpy_s(proItem.strSoftwareVersion, pTmp);
}
delete[]pBuffer;
pBuffer =
NULL;
}
转载于:https://www.cnblogs.com/yunbuyi/p/4906240.html
相关资源:JAVA上百实例源码以及开源项目