public static FileVersionInfo GetFileVersionInfo(string path) { uint unuse = 0; uint bufSize = Win32Import.GetFileVersionInfoSize(path, ref unuse); if (bufSize != 0) { byte[] buf = new byte[bufSize]; if (Win32Import.GetFileVersionInfo(path, 0, bufSize, buf) != 0) { FileVersionInfo fileVersionInfo = new FileVersionInfo(); IntPtr data = IntPtr.Zero; uint dataSize = 0; if (Win32Import.VerQueryValue(buf, @"\", ref data, ref dataSize) > 0 && dataSize == Marshal.SizeOf(fileVersionInfo.fixedInfo)) { fileVersionInfo.fixedInfo = (Win32Import.VS_FixedFileInfo)Marshal.PtrToStructure( data, typeof(Win32Import.VS_FixedFileInfo)); } short[] langCodeList = null; if (Win32Import.VerQueryValue(buf, @"\VarFileInfo\Translation", ref data, ref dataSize) > 0) { langCodeList = new short[dataSize / 2]; Marshal.Copy(data, langCodeList, 0, langCodeList.Length); } if (langCodeList != null) { fileVersionInfo.langBasedInfoList = new FileVersionInfo.LanguageBasedFileInfo[langCodeList.Length / 2]; for (int i = 0; i < fileVersionInfo.langBasedInfoList.Length; ++i) { FileVersionInfo.LanguageBasedFileInfo langBasedInfo = new FileVersionInfo.LanguageBasedFileInfo(); langBasedInfo.language = unchecked((ushort)langCodeList[i * 2]); langBasedInfo.codePage = unchecked((ushort)langCodeList[i * 2 + 1]); Func<string, string> verQueryString = s => { string fmt = string.Format( "\\StringFileInfo\\{0:x4}{1:x4}\\{2}", langBasedInfo.language, langBasedInfo.codePage, s); if (Win32Import.VerQueryValue(buf, fmt, ref data, ref dataSize) > 0) { char[] tempBuf = new char[dataSize / 2]; Marshal.Copy(data, tempBuf, 0, tempBuf.Length); return new string(tempBuf); } return string.Empty; }; langBasedInfo.comments = verQueryString("Comments"); langBasedInfo.internalName = verQueryString("InternalName"); ; langBasedInfo.productName = verQueryString("ProductName"); ; langBasedInfo.companyName = verQueryString("CompanyName"); ; langBasedInfo.legalCopyright = verQueryString("LegalCopyright"); ; langBasedInfo.productVersion = verQueryString("ProductVersion"); ; langBasedInfo.fileDescription = verQueryString("FileDescription"); ; langBasedInfo.legalTrademarks = verQueryString("LegalTrademarks"); ; langBasedInfo.privateBuild = verQueryString("PrivateBuild"); ; langBasedInfo.fileVersion = verQueryString("FileVersion"); ; langBasedInfo.originalFilename = verQueryString("OriginalFilename"); ; langBasedInfo.specialBuild = verQueryString("SpecialBuild"); ; fileVersionInfo.langBasedInfoList[i] = langBasedInfo; } } return fileVersionInfo; } } return new FileVersionInfo(); }
public static FileVersionInfo GetFileVersionInfo(string path) { uint unuse = 0; uint bufSize = Win32Import.GetFileVersionInfoSize(path, ref unuse); if (bufSize != 0) { byte[] buf = new byte[bufSize]; if (Win32Import.GetFileVersionInfo(path, 0, bufSize, buf) != 0) { FileVersionInfo fileVersionInfo = new FileVersionInfo(); IntPtr data = IntPtr.Zero; uint dataSize = 0; if (Win32Import.VerQueryValue(buf, @"\", ref data, ref dataSize) > 0 && dataSize == Marshal.SizeOf(fileVersionInfo.fixedInfo)) { fileVersionInfo.fixedInfo = (Win32Import.VS_FixedFileInfo)Marshal.PtrToStructure( data, typeof(Win32Import.VS_FixedFileInfo)); } short[] langCodeList = null; if (Win32Import.VerQueryValue(buf, @"\VarFileInfo\Translation", ref data, ref dataSize) > 0) { langCodeList = new short[dataSize / 2]; Marshal.Copy(data, langCodeList, 0, langCodeList.Length); } if (langCodeList != null) { fileVersionInfo.langBasedInfoList = new FileVersionInfo.LanguageBasedFileInfo[langCodeList.Length / 2]; for (int i = 0; i < fileVersionInfo.langBasedInfoList.Length; ++i) { FileVersionInfo.LanguageBasedFileInfo langBasedInfo = new FileVersionInfo.LanguageBasedFileInfo(); langBasedInfo.language = unchecked ((ushort)langCodeList[i * 2]); langBasedInfo.codePage = unchecked ((ushort)langCodeList[i * 2 + 1]); Func <string, string> verQueryString = s => { string fmt = string.Format( "\\StringFileInfo\\{0:x4}{1:x4}\\{2}", langBasedInfo.language, langBasedInfo.codePage, s); if (Win32Import.VerQueryValue(buf, fmt, ref data, ref dataSize) > 0) { char[] tempBuf = new char[dataSize / 2]; Marshal.Copy(data, tempBuf, 0, tempBuf.Length); return(new string(tempBuf)); } return(string.Empty); }; langBasedInfo.comments = verQueryString("Comments"); langBasedInfo.internalName = verQueryString("InternalName");; langBasedInfo.productName = verQueryString("ProductName");; langBasedInfo.companyName = verQueryString("CompanyName");; langBasedInfo.legalCopyright = verQueryString("LegalCopyright");; langBasedInfo.productVersion = verQueryString("ProductVersion");; langBasedInfo.fileDescription = verQueryString("FileDescription");; langBasedInfo.legalTrademarks = verQueryString("LegalTrademarks");; langBasedInfo.privateBuild = verQueryString("PrivateBuild");; langBasedInfo.fileVersion = verQueryString("FileVersion");; langBasedInfo.originalFilename = verQueryString("OriginalFilename");; langBasedInfo.specialBuild = verQueryString("SpecialBuild");; fileVersionInfo.langBasedInfoList[i] = langBasedInfo; } } return(fileVersionInfo); } } return(new FileVersionInfo()); }