2012-01-11 11 views
7

カスタムバージョン情報を含む大きな実行可能ファイル(> 1,2 GB)があります。 「FileVersionInfo」クラスの「GetVersionInfo」を使って、これらのファイルからこの「バージョン情報」を取得しようとしました。 何らかの理由で、この方法でWindows XPで大容量ファイル(Tested with 1 GB以上)のバージョン情報が返されません。それは18 MBのサイズのファイルのために働いた。 Windows 7(x86およびX64)で同じものを試してみると、すべてのファイル、さらに大きなoncesでも動作します!大きなファイルからバージョン情報を取得

Reflectorツールを使用してFileVersionInfoクラスを調べました。「GetVersionInfo」メソッドと同じように、「ファイルバージョン情報」サイズ を取得するための小さなコンソールアプリケーションを作成しました。 Windows XPおよびWindows 7では、サイズが0(ゼロ)が返され、同じファイルに対して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

+0

はい、18MBはXPで動作します! – RBDev

答えて

2

ローダは、おそらくそのアドレス空間にファイル全体をマッピングすることができませんでした。 PEファイル形式を読んで、バージョンリソースを探してください。

ただし、このような大きなPE画像で何をしていますか?カスタムリソースの場合は、.exeに追加するほうが効果的です。そのため、ローダーはちょっとマップしてから直接アクセスする必要があります。これには、サイズを知っている必要があります(「このプログラムはMS-DOSモードでは実行できません」というエラーメッセージの後にパッドとして保存されるため、オフセット124で4バイトが安全に上書きされます)。

関連する問題