int iVersionInfoSize = 0; BYTE* lpVersionDataBuffer; int retval = 0; int res = -999; BYTE* lplpVersion; VS_FIXEDFILEINFO* version; DWORD dwVersionSize;
if (lpszFileName == NULL) { return(res); } iVersionInfoSize = GetFileVersionInfoSize(lpszFileName,0); if (iVersionInfoSize > 0) { lpVersionDataBuffer = new BYTE[iVersionInfoSize]; retval = GetFileVersionInfo (lpszFileName,0,iVersionInfoSize,lpVersionDataBuffer); if (retval != 0) { retval = VerQueryValue(lpVersionDataBuffer,"\\",(void**)&lplpVersion,(unsigned int*)&dwVersionSize); if (retval != 0) { version = (VS_FIXEDFILEINFO*)lplpVersion; *iMajor = version->dwFileVersionMS >> 16; *iMinor = version->dwFileVersionMS & 0xFFFF; *iRelease = version->dwFileVersionLS >> 16; *iBuild = version->dwFileVersionLS & 0xFFFF; res = 0; } else { res = -3; } } else { res = -2; } if (lpVersionDataBuffer != NULL) { delete lpVersionDataBuffer; lpVersionDataBuffer = NULL; } } else { res = -1; } return(res); }
String strFileVersion = string.Format("{0}.{1}.{2}.{3}",myFileVersion.FileMajorPart, myFileVersion.FileMinorPart, myFileVersion.FileBuildPart, myFileVersion.FilePrivatePart);
[DllImport("version.dll")]
private static extern int GetFileVersionInfoSize(
string lpstrFilename ,
int lpdwHandle);[DllImport("version.dll")]
private static extern int GetFileVersionInfo(
string lpstrFilename ,
int dwHandle,
int dwLen,
byte[] lpData);
[DllImport("version.dll")]
private static extern int VerQueryValue(
byte[] lpVersionDataBuffer ,
string lpSubBlock,
byte[] lpBuffer,
ref int lpBufferLength);不知各位大侠是否有简单点的方法.或者C#中是否有简单些的方法.
Version ver = assembly.GetName().Version;
在界面中显示如下类似信息:已安装如下模块:
aaaa.exe 版本1.2.3.332
bb.exe 版本3.4.5.366
t.dll 版本4.4.3.33需要在C#中实现去读取这些文件的版本号信息,但这些文件不全是C#编写的,
又很多是用VC编写的.
System.Reflection.Assembly fileAssembly = System.Reflection.Assembly.LoadFrom(searchFile);
System.Version fileVersion = fileAssembly.GetName().Version;只能得到C#编写的程序版本,其它开发工具例如VC或VB编写的程序或模块版本都得不到.
LPTSTR lpszFileName,
DWORD* iMajor,
DWORD* iMinor,
DWORD* iRelease,
DWORD* iBuild
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int iVersionInfoSize = 0;
BYTE* lpVersionDataBuffer;
int retval = 0;
int res = -999;
BYTE* lplpVersion;
VS_FIXEDFILEINFO* version;
DWORD dwVersionSize;
if (lpszFileName == NULL)
{
return(res);
} iVersionInfoSize = GetFileVersionInfoSize(lpszFileName,0);
if (iVersionInfoSize > 0)
{
lpVersionDataBuffer = new BYTE[iVersionInfoSize];
retval = GetFileVersionInfo (lpszFileName,0,iVersionInfoSize,lpVersionDataBuffer);
if (retval != 0)
{
retval = VerQueryValue(lpVersionDataBuffer,"\\",(void**)&lplpVersion,(unsigned int*)&dwVersionSize);
if (retval != 0)
{
version = (VS_FIXEDFILEINFO*)lplpVersion;
*iMajor = version->dwFileVersionMS >> 16;
*iMinor = version->dwFileVersionMS & 0xFFFF;
*iRelease = version->dwFileVersionLS >> 16;
*iBuild = version->dwFileVersionLS & 0xFFFF;
res = 0;
}
else
{
res = -3;
}
}
else
{
res = -2;
}
if (lpVersionDataBuffer != NULL)
{
delete lpVersionDataBuffer;
lpVersionDataBuffer = NULL;
}
}
else
{
res = -1;
} return(res);
}