Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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());
        }