2012-01-11 36 views
7

我們擁有包含自定義版本信息的大型可執行文件(> 1,2 GB)。 我試圖通過使用'FileVersionInfo'類的'GetVersionInfo'從這些文件中檢索'版本信息'。 由於某些原因,此方法在Windows XP中不會返回較大文件的版本信息(使用> 1 GB進行測試)。它的確適用於大小爲18 MB的文件。 當我在Windows 7(x86和X64)中嘗試使用它時,它適用於所有文件,即使是更大的使用者!從大文件中檢索版本信息

我用了一個反射器工具來看看進入FileVersionInfo類和我創建了一個小型控制檯應用檢索「文件版本Info'尺寸, 就像‘GetVersionInfo’的方法一樣。在Windows XP中返回0(零)的大小,在Windows 7中返回相同文件的大小爲1428的大小。 XP中的最後一個錯誤是1812('指定的圖像文件不包含資源部分')。

爲什麼這在Windows XP中不起作用,並在Windows 7中起作用的原因是什麼? 是否有解決方法來檢索版本信息?

下面的代碼我已經測試:

class Program 
{ 
    [DllImport("version.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int GetFileVersionInfoSize(string lptstrFilename, out int handle); 

    static void Main(string[] args) 
    { 
     Console.Write("Path which contains the executables: "); 
     string path = Console.ReadLine(); 

     foreach (string fileName in Directory.EnumerateFiles(path)) 
     { 
      int num; 
      int fileVersionInfoSize = GetFileVersionInfoSize(fileName, out num); 
      int error = Marshal.GetLastWin32Error(); 

      Console.WriteLine("File Version Info Size: " + fileVersionInfoSize); 

      if (error != 0) 
      { 
       Console.WriteLine("Last Error: " + error); 
      } 
     } 

     Console.ReadKey(); 
    } 
} 
+0

要確認,18MB文件在XP上工作? – keyboardP 2012-01-11 15:50:11

+0

是的,18 MB在XP上工作! – RBDev 2012-01-11 15:50:49

回答

2

加載程序可能無法映射整個文件到其地址空間。隨意閱讀PE文件格式以查找版本資源。

然而,你在做什麼這麼大的PE圖像?如果它的自定義資源,它可以更好地將它們附加到.exe,因此加載器只需映射一點點,然後直接訪問它們。這要求你知道你的大小(在「本程序不能在MS-DOS模式下運行」錯誤信息存根)之後,在偏移量124處有4個字節可以安全覆蓋,因爲它們是填充的。