78173


現在でも、Officeが32bitか64bitかが混在しているさなかだと思いますが、それを  
C#やVBAのコードでPCにインストールされているOfficeのbit数を取得できる方法を探しています。

手動で確認する方法は解っていますが、それをコードで実現したいのです。

使用する言語は、C#かVBAだけです。もちろんAPI等も触るかと思います。

お分かりの方がいましたら、回答をお願いいたします。


CC BY-SA 4.0
2021-07-13T00:04:39.103
78142
2021-07-17T02:54:52.917
2021-07-13T00:28:41.483
3060
9374
question
c# vba ms-office
C#、もしくはVBA(API?)で、インストールされているMS Officeのビット数を調べたい


C#からやるなら、こんなんでどうでしょう。  
※エラー処理は適当です。

[code]

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    namespace ConsoleNetApp1
    {
        class Program
        {
            [DllImport("kernel32.dll")]
            static extern bool IsWow64Process(
                IntPtr hProcess,
                out bool Wow64Process
            );
    
            private static bool? IsExcel32Bit()
            {
                bool? result;
                dynamic app = null;
                try
                {
                    var excelType = Type.GetTypeFromProgID("Excel.Application");
                    if (excelType == null)
                    {
                        return null;
                    }
                    app = Activator.CreateInstance(excelType);
                    var procs = Process.GetProcessesByName("excel");
                    if (procs.Length == 0)
                    {
                        return null;
                    }
    
                    if (!Environment.Is64BitOperatingSystem)
                    {
                        return true;
                    }
    
                    bool bWow64;
                    if (!IsWow64Process(procs[0].Handle, out bWow64))
                    {
                        return null;
                    }
    
                    result = bWow64;
                }
                catch (COMException)
                {
                    return null;
                }
                finally
                {
                    if (app != null)
                    {
                        app.Quit();
                        Marshal.ReleaseComObject(app);
                        app = null;
    
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                    }
                }
    
                return result;
            }
    
            static void Main(string[] args)
            {
                Console.WriteLine(IsExcel32Bit());
    
                Console.ReadKey();
            }
        }
    }
    
[/code]

dynamic型がコンパイルエラーになる場合、Microsoft.CSharpを参照に追加してください。


CC BY-SA 4.0
2021-07-14T02:34:30.293
78173
2021-07-17T02:54:52.917
2021-07-17T02:54:52.917
41943
41943
78142
answer