从 Excel 应用程序对象中查找位数(32 位/64 位)?

Posted

技术标签:

【中文标题】从 Excel 应用程序对象中查找位数(32 位/64 位)?【英文标题】:Find bitness (32-bit/64-bit) from Excel Application object? 【发布时间】:2011-09-05 11:09:49 【问题描述】:

是否可以从 Microsoft.Office.Interop.Excel.ApplicationClass 确定 Excel 是在 32 位还是 64 位中运行? 编辑该解决方案应该适用于 Excel 2010 和 Excel 2007

【问题讨论】:

你的意思是你的程序和Excel不在同一个进程吗? @Simon - 我不太明白你的问题。 Excel 是自动进程外的,因此没有程序可以在同一进程中与 Excel 对话。如果我有一个 ApplicationClass 对象(通过 Excel 互操作),我想知道是否可以确定关联的 Excel 进程是运行 32 位还是 64 位(必须是 Excel 2010) 即对象模型是否支持有关Excel进程位数的信息 我想你可能正在处理中,但是好的,我得到了问题 :-) 【参考方案1】:

这段代码应该为您提供 Excel 的“位”。

Microsoft.Office.Interop.Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (System.Runtime.InteropServices.Marshal.SizeOf(app.HinstancePtr) == 8)

    // excel 64-bit

else

    // excel 32-bit

编辑:这是另一个版本,也应该适用于以前版本的 Excel。只需将 ApplicationClass 引用传递给它:

    public static ExcelVersion GetExcelVersion(object applicationClass)
    
        if (applicationClass == null)
            throw new ArgumentNullException("applicationClass");

        PropertyInfo property = applicationClass.GetType().GetProperty("HinstancePtr", BindingFlags.Instance | BindingFlags.Public);
        if (property == null)
            return ExcelVersion.Excel;

        return (System.Runtime.InteropServices.Marshal.SizeOf(property.GetValue(applicationClass, null)) == 8) ? ExcelVersion.Excel2010_64 : ExcelVersion.Excel2010_32;
    

    public enum ExcelVersion
    
        Excel, // before 2010, so 32 bits
        Excel2010_32,
        Excel2010_64
    

【讨论】:

我也想推荐这个,但我没有这样做,因为它只适用于 Excel 2010。 @Daniel - 是否有适用于 Excel 2007 的解决方案。其实我这个问题的目的是要判断我运行的是64位2010还是32位2007。我是混合环境。 我想我可以尝试获取 HinstancePtr,如果失败了,那么我知道我正在运行 32 位,因为平台 我提出的解决方案不起作用。 .net 在我有机会尝试/捕获之前抛出 MissingMethodException。【参考方案2】:

也许这可以工作(用 Excel 2013 ff 为我做。)

try

    Type officeType = Type.GetTypeFromProgID("Excel.Application");
    object excelInstance = Activator.CreateInstance(officeType);
    if (excelInstance != null)
    
        string results = officeType.InvokeMember("OperatingSystem", BindingFlags.GetProperty, null, excelInstance, null).ToString();
        if (!string.IsNullOrEmpty(results))
            detectedExcelPlatform = results.Contains("64")?EDetectExcelPlattform.Force64Bit:EDetectExcelPlattform.Force32Bit;
        officeType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, excelInstance, null);
    

catch

    // To Ignore

EDetectExcelPlattform 没关系,因为它只是来自我自己的代码。可以用 bool 结果替换。

【讨论】:

以上是关于从 Excel 应用程序对象中查找位数(32 位/64 位)?的主要内容,如果未能解决你的问题,请参考以下文章

Qt从excel导入数据-ODBC

CPU位数操作系统位数应用程序位数都是什么

pyc与数据类型

仅使用 32 位整数的算术运算

Count bits set in parallel(查找32位整形数中置1的个数)

如何在excel中保留小数点后两位