Получение информации о версии DLL через Win32 - VerQueryValue (…) падает под Win7 x64

Уважаемая реализация .NET-оболочки с открытым исходным кодом (SharpBITS) изСлужбы Windows BITS не удается определить базовую версию BITS под Win7 x64.

Вот исходный код, который терпит неудачу. NativeMethods - это нативные вызовы Win32, обернутые методами .NET и декорированные атрибутом DllImport.

private static BitsVersion GetBitsVersion()
    {
        try
        {
            string fileName = Path.Combine(
                     System.Environment.SystemDirectory, "qmgr.dll");
            int handle = 0;
            int size = NativeMethods.GetFileVersionInfoSize(fileName, 
                                                            out handle);
            if (size == 0) return BitsVersion.Bits0_0;
            byte[] buffer = new byte[size];
            if (!NativeMethods.GetFileVersionInfo(fileName, 
                                                  handle, 
                                                  size, 
                                                  buffer))
            {
                return BitsVersion.Bits0_0;
            }
            IntPtr subBlock = IntPtr.Zero;
            uint len = 0;
            if (!NativeMethods.VerQueryValue(buffer,
                              @"\VarFileInfo\Translation", 
                              out subBlock, 
                              out len))
            {
                return BitsVersion.Bits0_0;
            }

            int block1 = Marshal.ReadInt16(subBlock);
            int block2 = Marshal.ReadInt16((IntPtr)((int)subBlock + 2 ));
            string spv = string.Format(
                 @"\StringFileInfo\{0:X4}{1:X4}\ProductVersion", 
                 block1, 
                 block2);

            string versionInfo;
            if (!NativeMethods.VerQueryValue(buffer, 
                                             spv, 
                                             out versionInfo, 
                                             out len))
            {
                return BitsVersion.Bits0_0;
            }
...

Реализация следует заИнструкции MSDN по письму. Во время второго вызова VerQueryValue (...) приложение вылетает иубивает сеанс отладки без промедления. Еще немного отладочной информации прямо перед сбоем:

spv => "\ StringFileInfo \ 040904B0 \ ProductVersion"buffer => byte [1900] - заполнен двоичными даннымиblock1 => 1033block2 => 1200

Я посмотрел на целевой файл "C: \ Windows \ System32 \ qmgr.dll" (реализация BITS) через Windows. Это говорит о том, что версия продукта - 7.5.7600.16385. Вместо сбоя это значение должно возвращаться в строке verionInfo. Любой совет?

Ответы на вопрос(3)

Ваш ответ на вопрос