GetBinaryType () возвращает разрядность в соответствии с вызывающим приложением - PullRequest
0 голосов
/ 27 января 2020

Я использую это , чтобы определить, является ли Office 32-разрядным или 64-разрядным. Я звоню из приложения C#.

GetBinaryType(location, out bt)

Точно такой же код, вызывающий этот файл на winword.exe, возвращает 32-битный или 64-битный код, соответствующий битности моего C# приложение. Есть ли что-то, что мне нужно сделать при работе в 64-битном режиме, чтобы он все еще возвращал 32-битный для Office?

Я поместил здесь очень простой пример программы.

Выход, работающий в режиме x86 (на 64-битной Windows есть):

Работает в 32-битном режиме. GetBinaryType () возвращает SCS_32BIT_BINARY для файла C: \ Program Files (x86) \ Microsoft Office \ Root \ Office16 \ WINWORD.EXE

Вывод, работающий в 64-битном режиме:

Работа в 64-битном режиме. GetBinaryType () возвращает SCS_64BIT_BINARY для файла C: \ Program Files (x86) \ Microsoft Office \ Root \ Office16 \ WINWORD.EXE

У меня 32-разрядный Office на моем компьютере.

код (если вы не хотите загружать почтовый индекс):

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using Microsoft.Win32;

namespace TestGetBinaryType
{
    class Program
    {
        static void Main(string[] args)
        {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey($"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Winword.exe", RegistryRights.ReadKey))
            {
                if (key == null)
                {
                    Console.Error.WriteLine("Could not find the registry key SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Winword.exe");
                    return;
                }
                string location = key.GetValue(null) as string;
                if (!File.Exists(location))
                {
                    Console.Error.WriteLine($"File is not at specified location: {location}");
                    return;
                }

                BinaryType bt;
                if (!GetBinaryType(location, out bt))
                    throw new ApplicationException($"Could not read binary type from: {location}");
                Console.Out.WriteLine($"Running in {IntPtr.Size * 8}-bit mode.");
                Console.Out.WriteLine($"GetBinaryType() returns {bt} for file {location}");
            }
        }

        [DllImport("kernel32.dll")]
        static extern bool GetBinaryType(string lpApplicationName, out BinaryType lpBinaryType);

        public enum BinaryType : uint
        {
            SCS_32BIT_BINARY = 0,   // A 32-bit Windows-based application
            SCS_64BIT_BINARY = 6,   // A 64-bit Windows-based application.
            SCS_DOS_BINARY = 1,     // An MS-DOS � based application
            SCS_OS216_BINARY = 5,   // A 16-bit OS/2-based application
            SCS_PIF_BINARY = 3,     // A PIF file that executes an MS-DOS � based application
            SCS_POSIX_BINARY = 4,   // A POSIX � based application
            SCS_WOW_BINARY = 2      // A 16-bit Windows-based application
        }

    }
}
...