Я использую это , чтобы определить, является ли 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
}
}
}