如题
解决方案 »
- 关于typedef的函数应用
- 关于数组与指针的讨论
- 一个DLL程序即有WinMain函数又有DLLMain函数是怎么回事?
- 如何获得创建的对话框的颜色?
- 求图像的边缘点坐标得matlab程序,谢谢!
- 为什么 vc combo box 的 member variables 有时候只能加 int ,而有时候只能加 Cstring ,有什么不同?
- 询找 Visual Studio .NET 开发环境中的 docking功能?像 class view / solution explorer 窗口可靠在四边并有标签。
- 怎样在编辑框控件中输出换行?
- 一个关于从c++过度到vc的 问题?? 希望大家能够帮我解决
- 谁知道那里能下载《深入浅出 MFC 2/e 简体中文版》????
- 高手请问如何获取设备管理器中的硬件名称? 马上送分
- c# 都出来这么久了, 为什么学VC的人不跑去学C#, 听说C# 比较厉害,难道有些东西VC容易做, 而C#是很难做的?
BOOL CProcSpyApp::GetFileVersion(LPCTSTR lpszFileName, short *VerInfo)
{
VerInfo[0]=0;
VerInfo[1]=0;
VerInfo[2]=0;
VerInfo[3]=0;
DWORD dwInfoSize = GetFileVersionInfoSize((LPSTR)lpszFileName, NULL);
if(0 == dwInfoSize)
return FALSE;
char *cVersionInfo = NULL;
if(NULL == (cVersionInfo = new char[dwInfoSize]))
return FALSE;
if(0 == GetFileVersionInfo((LPSTR)lpszFileName, NULL, dwInfoSize, cVersionInfo))
{
delete cVersionInfo;
cVersionInfo = NULL;
return FALSE;
}
UINT uLen = 0;
DWORD* lpBuffer;
char szName[64];
if(0 == VerQueryValue(cVersionInfo, TEXT("\\VarFileInfo\\Translation"), (LPVOID *)&lpBuffer, &uLen))
{
delete cVersionInfo;
cVersionInfo = NULL;
return FALSE;
}
sprintf( szName, "\\StringFileInfo\\%04hX%04hX\\FileVersion",
LOWORD(*lpBuffer), HIWORD(*lpBuffer)) ;
char *lpInfo, *p1, *p2;
if(0 == VerQueryValue(cVersionInfo, szName, (LPVOID *)&lpInfo, &uLen))
{
delete cVersionInfo;
cVersionInfo = NULL;
return FALSE;
}
p1 = lpInfo;
for(int i=0; i<=3; i++)
{
p2 = szName;
while(*p1 && ',' != *p1 && '.' != *p1)
*p2++ = *p1++;
*p2 = 0;
if(*p1)
p1++;
VerInfo[i]=atoi(szName);
}
delete cVersionInfo;
cVersionInfo = NULL;
return TRUE;
}
并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。
下面是完整例子:
CString IS_GetAppVersion(char* AppName)
{
CString AppVersion;
//AppVersion=IS_GetAppCreateTime(AppName); DWORD RessourceVersionInfoSize;
DWORD JustAJunkVariabel;
char* VersionInfoPtr;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *TranslationPtr;
char* InformationPtr;
UINT VersionInfoSize;
char VersionValue[255]; RessourceVersionInfoSize=GetFileVersionInfoSize(AppName,&JustAJunkVariabel);
if(0!=RessourceVersionInfoSize)
{
VersionInfoPtr=new char[RessourceVersionInfoSize];
if(GetFileVersionInfo(AppName,0,RessourceVersionInfoSize,VersionInfoPtr))
{
if(!VerQueryValue(
VersionInfoPtr,
TEXT("VarFileInfo\\Translation"),
(LPVOID*)&TranslationPtr,
&VersionInfoSize))
{
delete[] VersionInfoPtr;
return AppVersion;
}
} // retrieve File Description
wsprintf(VersionValue,
TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
TranslationPtr[0].wLanguage,
TranslationPtr[0].wCodePage); if(!VerQueryValue(
VersionInfoPtr,
VersionValue,
(LPVOID*)&InformationPtr,
&VersionInfoSize))
{
delete[] VersionInfoPtr;
return AppVersion;
}
if(strlen(InformationPtr)>0) //Not Null
{
AppVersion=CString(InformationPtr);
}
delete[] VersionInfoPtr;
}
return AppVersion;
}void CGetFileVersionDlg::OnButton1()
{
CString strVersion = IS_GetAppVersion("d:\\winnt\\winhlp32.exe");
AfxMessageBox(strVersion);
}
呵呵~~楼上帖的Monkey的代码很好了。