سؤال

الآن يأتي هذا المكتب أيضا في تثبيت 64 بت، حيث تكتشف في السجل إذا كان إصدار Office مثبتا هو 32 بت أو 64 بت؟

هل كانت مفيدة؟

المحلول

من تقنية تكنيت 64 بت إصدارات Office 2010:

إذا قمت بتثبيت Office 2010 بما في ذلك Microsoft Outlook 2010، يقوم Outlook بتعيين مفتاح تسجيل يدعى بيليس من النوع REG_SZ. على الكمبيوتر الذي تم تثبيته. ال بيليس يشير مفتاح التسجيل إلى ما إذا كان تثبيت Outlook 2010 هو 32 بت أو 64 بت. قد يكون هذا مفيدا للمسؤولين المهتمين بمراجعة أجهزة الكمبيوتر لتحديد الإصدارات المثبتة من Office 2010 في منظمتهم.

  • مسار التسجيل: HKEY_LOCAL_MACHINE Software Microsoft Office 14.0 Outlook
  • إذا قمت بتثبيت Office 2013 ثم استخدم مسار التسجيل هذا: HKEY_LOCAL_MACHINE Software Microsoft Office 15.0 Outlook
  • مفتاح التسجيل: بيليس
  • القيمة: إما x86 أو x64

وأماكن أخرى في نفس المادة:

بدءا من Office 2010، يتوفر Outlook كتطبيق 32 بت وسادة 64 بت. يعتمد إصدار (bitness) من Outlook الذي تختاره على إصدار نظام تشغيل Windows (32 بت أو 64 بت) وإصدار Office 2010 (32 أو 64 بت) المثبت على الكمبيوتر، إذا تم تثبيت Office بالفعل على هذا الكمبيوتر.

تتضمن العوامل التي تحدد جدوى تثبيت إصدار 32 بت أو 64 بت من Outlook ما يلي:

  • يمكنك تثبيت Office 32 بت 2010 و Microsoft Outlook 32 بت 2010 على إصدار 32 بت مدعوم أو 64 بت من نظام تشغيل Windows. يمكنك تثبيت إصدار 64 بت من Office 2010 و 64 بت Outlook 2010 فقط على نظام تشغيل مدعوم 64 بت.
  • التثبيت الافتراضي ل Office 2010 على إصدار 64 بت من نظام التشغيل Windows هو Office 32 بت 2010.
  • يعد بيتك الإصدار المثبت من Outlook هو نفسه نفس الشيء من Office 2010، إذا تم تثبيت Office على نفس الكمبيوتر. وهذا هو، لا يمكن تثبيت إصدار 32 بت من Outlook 2010 على نفس الكمبيوتر الذي يتم فيه تثبيت إصدارات 64 بت من تطبيقات Office 2010 الأخرى، مثل Microsoft-Word Microsoft Word 2010 أو مايكروسوفت Microsoft 64 بت 2010. وبالمثل ، لا يمكن تثبيت إصدار 64 بت من Outlook 2010 على نفس الكمبيوتر الذي تم تثبيت إصدارات 32 بت من تطبيقات Office الأخرى بالفعل.

نصائح أخرى

لقد اختبرت إجابة Otaku ويبدو أن قيمة تلوين Outlook محددة حتى عند عدم تثبيت Outlook، على الرغم من أن المقالة المشار إليها لا تشير بوضوح إلى أن هذا سيكون هو الحال.

لإضافة إلى إجابة VTRZ، وهنا وظيفة كتبت لبرنامج Inno Setup:

const
  { Constants for GetBinaryType return values. }
  SCS_32BIT_BINARY = 0;
  SCS_64BIT_BINARY = 6;
  { There are other values that GetBinaryType can return, but we're }
  { not interested in them. }

{ Declare Win32 function  }
function GetBinaryType(lpApplicationName: AnsiString; var lpBinaryType: Integer): Boolean;
external 'GetBinaryTypeA@kernel32.dll stdcall';

function Is64BitExcelFromRegisteredExe(): Boolean;
var
  excelPath: String;
  binaryType: Integer;
begin
  Result := False; { Default value - assume 32-bit unless proven otherwise. }
  { RegQueryStringValue second param is '' to get the (default) value for the key }
  { with no sub-key name, as described at }
  { http://stackoverflow.com/questions/913938/ }
  if IsWin64() and RegQueryStringValue(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe',
      '', excelPath) then begin
    { We've got the path to Excel. }
    try
      if GetBinaryType(excelPath, binaryType) then begin
        Result := (binaryType = SCS_64BIT_BINARY);
      end;
    except
      { Ignore - better just to assume it's 32-bit than to let the installation }
      { fail.  This could fail because the GetBinaryType function is not }
      { available.  I understand it's only available in Windows 2000 }
      { Professional onwards. }
    end;
  end;
end;

نأسف أن نقول، ولكن لا تعمل كل من أساليب أوتاكو و @ كليتون من أجلي - لا توقع بيلونس ولا {90140000-0011-0000-1000-0000000FF1CE} في التسجيل (لمكتب 64 بت دون تثبيت Outlook).

الطريقة الوحيدة التي وجدتها، على الرغم من عدم إرجاء السجل، هي التحقق من البينس لأحد الملفات التنفيذية Office باستخدام وظيفة Windows API getbinytype. (منذ نظام التشغيل Windows 2000 Professional).

على سبيل المثال، يمكنك التحقق من بعض الشيء من Winword.exe، والذي يتم تخزين المسار تحت
HKEY_LOCAL_MACHINE Software Microsoft Windows CurrentVersion Winword.exe.

هنا هو جزء رمز MFC:

CRegKey rk;
if (ERROR_SUCCESS == rk.Open(HKEY_LOCAL_MACHINE, 
  "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Winword.exe", 
  KEY_READ)) {
    CString strWinwordPath;
    DWORD dwSize = MAX_PATH;
    if (ERROR_SUCCESS == rk.QueryStringValue(strWinwordPath, 
        strWinwordPath.GetBuffer(MAX_PATH), &dwSize)) {
            strWinwordPath.ReleaseBuffer();
            DWORD dwBinaryType;
            if (::GetBinaryType(strWinwordPath, &dwBinaryType)) {
                if (SCS_64BIT_BINARY == dwBinaryType) {
                    // Detected 64-bit Office 
                } else {
                    // Detected 32-bit Office 
                }
            } else {
                // Failed
            }
        } else {
            // Failed
        }
    } else {
    // Failed
}

انتباه: الاستعلام عن شيء تطبيق Outlook لا يعمل بشكل موثوق إذا دعا في بيئة .NET.

هنا، نستخدم GetBinyType () في DLL يمكن استدعاؤها بواسطة أي تطبيق:

  • إذا كان تطبيق المضيف هو 64 بت C / C ++، GetBinyType () إرجاع SCS_32BIB_BINARY.
  • إذا كان تطبيق المضيف هو 64 بت .NET (اخترنا "AnyCPU" على نظام 64 بت)، إرجاع GetBinyType () SCS_64BIB_BINARY.

مع نفس رمز DLL بالضبط والضبط نفس المسار الثنائي Outlook ("C: / ملفات البرنامج (X86) / ...") على نفس الكمبيوتر.

وهذا يعني أنك قد تحتاج إلى اختبار الملف الثنائي بنفسك باستخدام "image_nt_headers.fileheader.machine".

الله، أنا أكره قيم العودة غير الصحيحة لبعض واجهات برمجة التطبيقات ويندوز (انظر أيضا النزول () كذبة).

لقد وجدت الطريق لفحص بيتك.

يمكننا التحقق من Bitness Office 365 و 2016 باستخدام مفتاح التسجيل هذا:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration

منصة X86 لمدة 32 بت.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration

منصة X64 لمدة 64 بت.

يرجى المراجعة...

لقد وجدت هذا النهج:

إذا كان HKLM Software WoW6432Node ثم Windows هو 64 بت.

إذا كان HKLM Software Wow6432Node Microsoft Office، ثم Office هو 32 بت.

إذا كان HKLM Software Wow6432Node Microsoft Office غير موجود، ولكن HKLM Software Microsoft Office موجود، ثم Office هو 64 بت.

إذا كان HKLM Software Wow6432Node غير موجود، ثم Windows و Office هي 32 بت.

مصدر: منتديات تكنيت

إليك ما كنت قادرا على استخدامه في VBScript للكشف عن Office 64bit Outlook:

Dim WshShell, blnOffice64, strOutlookPath
Set WshShell = WScript.CreateObject("WScript.Shell")
blnOffice64=False
strOutlookPath=WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\outlook.exe\Path")
If WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "AMD64" And _
    not instr(strOutlookPath, "x86") > 0 then 
  blnOffice64=True
  wscript.echo "Office 64"
End If

يمكنك البحث في السجل {90140000-0011-0000-0000-0000000FF1CE}. إذا كانت الأرقام الجريئة تبدأ مع 0 لها x86، 1 هي x64

بالنسبة لي كان في HKEY_LOCAL_MACHINE Software Microsoft Office 14.0 تسجيل {90140000-0057-0000-0000-0000000FF1CE}

مصدر

يعمل رمز Innosetup هذا بالنسبة لي ضمن Win 10x64 و Office 2016 X86 (باستخدام "HKLM Software Microsoft Office Clicktorun Configuration" و "النظام الأساسي")

[Code]
const
  RegOffice='SOFTWARE\Microsoft\Office\ClickToRun\Configuration';
  RegOfficeKey='Platform';

/// <summary>
/// Get current HKLM version
/// </summary>
function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;
end;

/// <summary>
/// Check is Microsoft Office is installed or not
/// </summary>
function IsOfficeInstalled (): Boolean;
var
  platform: string;
begin
  RegQueryStringValue(GetHKLM(), RegOffice, RegOfficeKey, platform);
  if platform = 'x86' then begin
   SuppressibleMsgBox('Microsoft Office found (x86 version)' , mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES);
    Result := True;
  end else if platform = 'x64' then begin
    SuppressibleMsgBox('Microsoft Office found (x64 version)', mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES);
    Result := True;
  end else begin
    SuppressibleMsgBox('Microsoft Office NOT found' + platform + '.', mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES);
    Result := False;
  end;
end;

ليس لدي مفتاح يسمى bitness في أي من هذه المجلدات. لدي مفتاح يسمى "الافتراضي" في كل من هذه المجلدات والقيمة هي "Unset" جاء جهاز الكمبيوتر الخاص بي مع Office 2010 Starter (أفترض 64 بت). قمت بإزالةها وحاولت القيام بتثبيت كامل من 32 بت منصب. أظل الحصول على الرسالة التالية. الملف غير متوافق، تحقق لمعرفة ما إذا كنت بحاجة إلى إصدار X86 أو x64 من البرنامج.

أي نصيحة لي؟

mclatonh: هذا هو مسار التسجيل على جهاز الكمبيوتر الخاص بي: HKEY_LOCAL_MACHINE SOFTWARE Microsoft Office 14.0 Registration {90140000-002A-0000-1000-0000000FFF1CE} وهو بالتأكيد تثبيت 32 بت على 64 بت نظام التشغيل

لقد اتبعت في السابق عمياء الإجابة بناء على مستندات MSDN. اليوم، تحول هذا ليكون أقل مما هو مطلوب. على آلة مع Office Home والطالب المثبت، والتي لا تتضمن Outlook، HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook كان حاضرا، ولكن HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook لم يكن. لقد غيرت الآن التعليمات البرمجية الخاصة بي لأول مرة للحصول على إصدار "عادي" غير WOW6432Node. إذا كان ذلك حاضرا، فسيتم استخدامه. إذا لم يكن الأمر كذلك، فسوف يستمر من خلال النظر في إصدار WOW6432Node. يتم فحص هذا في برنامج Installer القائم على إعداد Inno - لا أعرف استخدامات إعداد APIS Inno. إذا لم يصل تطبيقك إلى التسجيل بنفس الطريقة، فقد ترى نتائج مختلفة.

كتبت هذا للتوقعات في البداية. تعديلها قليلا بالنسبة للكلمة، لكنها لن تعمل على تثبيت مستقل لأن هذا المفتاح لا يظهر البينة، فقط Outlook لا.

أيضا، لقد كتبت ذلك إلى دعم الإصدارات الحالية فقط من Office، => 2010

جردت جميع الإعداد ونشر المعالجة ...

:checkarch
    IF NOT "%PROCESSOR_ARCHITECTURE%"=="x86" SET InstallArch=64bit
    IF "%PROCESSOR_ARCHITEW6432%"=="AMD64" SET InstallArch=64bit
    IF "%InstallArch%"=="64bit" SET Wow6432Node=\Wow6432Node
GOTO :beginscript

:beginscript
SET _cmdDetectedOfficeVersion=reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"
@FOR /F "tokens=* USEBACKQ" %%F IN (`!_cmdDetectedOfficeVersion! 2^>NUL `) DO (
SET _intDetectedOfficeVersion=%%F
)
set _intDetectedOfficeVersion=%_intDetectedOfficeVersion:~-2%


:switchCase
:: Call and mask out invalid call targets
    goto :case!_intDetectedOfficeVersion! 2>nul || (
:: Default case
    ECHO Not installed/Supported
    )
  goto :case-install

:case14
    Set _strOutlookVer= Word 2010 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    GOTO :case-install  
:case15
    Set _strOutlookVer= Word 2013 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    GOTO :case-install
:case16
    Set _strOutlookVer= Word 2016 (!_intDetectedOfficeVersion!)
    CALL :GetBitness !_intDetectedOfficeVersion!
    goto :case-install
:case-install
    CALL :output_text !_strOutlookVer! !_strBitness! is installed
GOTO :endscript


:GetBitness
FOR /F "tokens=3*" %%a in ('reg query "HKLM\Software%Wow6432Node%\Microsoft\Office\%1.0\Outlook" /v Bitness 2^>NUL') DO Set _strBitness=%%a
GOTO :EOF

في اختباراتي، تفشل العديد من الأساليب الموصوفة هنا، وأعتقد أنهم يعتمدون على إدخالات في سجل Windows التي تتحدث غير موثوق، اعتمادا على إصدار Office، وكيف تم تثبيتها إلخ. لذلك نهج مختلف هو عدم استخدامه السجل على الإطلاق (موافق، بصرامة للغاية لا يجعلها إجابة على السؤال كما هو موضح)، ولكن بدلا من ذلك كتابة برنامج نصي:

  1. Instantiates Excel.
  2. يضيف مصنف إلى هذا المثيل Excel
  3. يضيف وحدة VBA إلى هذا المصنف
  4. ضخ وظيفة VBA الصغيرة التي ترجع قليلا من المكتب
  5. يدعو هذه الوظيفة
  6. ينظف

إليك هذا النهج المنفذ في VBScript:

Function OfficeBitness()

    Dim VBACode, Excel, Wb, Module, Result

    VBACode = "Function Is64bit() As Boolean" & vbCrLf & _
              "#If Win64 Then" & vbCrLf & _
              "    Is64bit = True" & vbCrLf & _
              "#End If" & vbCrLf & _
              "End Function"

    On Error Resume Next
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = False
    Set Wb = Excel.Workbooks.Add
    Set Module = Wb.VBProject.VBComponents.Add(1)
    Module.CodeModule.AddFromString VBACode
    Result = Excel.Run("Is64bit")
    Set Module = Nothing
    Wb.Saved = True
    Wb.Close False
    Excel.Quit
    Set Excel = Nothing
    On Error GoTo 0
    If IsEmpty(Result) Then
        OfficeBitness = 0 'Alternatively raise an error here?
    ElseIf Result = True Then
        OfficeBitness = 64
    Else
        OfficeBitness = 32
    End If

End Function

ملاحظة. يعمل هذا النهج ببطء أكثر من غيرها هنا (حوالي ثانيتين على جهاز الكمبيوتر الخاص بي) ولكن قد يتحول إلى أن يكون أكثر موثوقية عبر منشآت مختلفة وإصدارات المكاتب.

بعد بضعة أشهر، أدركت أنه قد يكون هناك نهج أبسط، على الرغم من أنه لا يزال يحمل إنشاء مثيل Excel. VBScript هي:

Function OfficeBitness()
    Dim Excel
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = False
    If InStr(Excel.OperatingSystem,"64") > 0 Then
        OfficeBitness = 64
    Else
        OfficeBitness = 32
    End if
    Excel.Quit
    Set Excel = Nothing
End Function

هذا يعتمد على حقيقة أن Application.OperatingSystem, ، عند الاتصال من 32 بت Excel على عائدات Windows 64 بت Windows (32-bit) NT 10.00 أو على الأقل يفعل على جهاز الكمبيوتر الخاص بي. لكن هذا غير مذكور في مستندات.

لدي Win 7 64 بت + Excel 2010 32 بت. السجل هو HKEY_LOCAL_MACHINE SOFTWARE Microsoft Office 14.0 التسجيل {90140000-002A-0000-1000-00000FFF1CE}

لذلك يمكن أن يخبر هذا قليلا من نظام التشغيل، وليس البغي

لقد وجدت وسيلة آمنة وموثوقة في البرنامج النصي الذي يستند إلى Innosetup لفهم ما إذا كان تطبيق معين هو 32 بت أو 64 بت (في حالتي، أحتاج إلى اختبار Excel)، باستخدام وظيفة Win32 API. وتسمى هذه الوظيفة GetBinaryType(), ، يأتي من "kernel32" (على الرغم من الاسم الذي يأتي في نكهة 32 و 64 بت) ويبدو مباشرة في رأس exe.

هذه المادة ويكيبيديا تنص على:

على إصدارات 64 بت من النوافذ، يوجد مجلدان لملفات التطبيق؛ ال "Program Files" يحتوي المجلد على برامج 64 بت و "Program Files (x86)" يحتوي المجلد على برامج 32 بت.

لذلك إذا تم تثبيت البرنامج بموجب C:\Program Files إنها نسخة 64 بت. إذا تم تثبيتها تحت C:\Program Files (x86) إنه تثبيت 32 بت.

هناك طريقة أخرى للكشف عن بعض الشيء هو معرفة typelib.

على سبيل المثال، للكشف عن تلوين Outlook، اكتب ملف .js على النحو التالي:

function detectVersion()
    var outlooktlib = "TypeLib\\{00062FFF-0000-0000-C000-000000000046}";
    var HKCR = 0x80000000;

    var loc = new ActiveXObject("WbemScripting.SWbemLocator");
    var svc = loc.ConnectServer(null,"root\\default");
    var reg = svc.Get("StdRegProv");

    var method = reg.Methods_.Item("EnumKey");
    var inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib;
    var outparam = reg.ExecMethod_(method.Name,inparam);
    tlibver = outparam.sNames.toArray()[0];

    method = reg.Methods_.Item("GetStringValue");
    inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win32";
    inparam.sValueName = "";
    outparam = reg.ExecMethod_(method.Name,inparam);
    if(outparam.sValue) return "32 bit";

    method = reg.Methods_.Item("GetStringValue");
    inparam = method.InParameters.SpawnInstance_();
    inparam.hDefKey = HKCR;
    inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win64";
    inparam.sValueName = "";
    outparam = reg.ExecMethod_(method.Name,inparam);
    if(outparam.sValue) return "64 bit";

    return "Not installed or unrecognizable";
}

يمكنك معرفة معرف Typelib للمكونات المكتبية الأخرى، واستبدال السطر الأول من الوظيفة لذلك. فيما يلي قائمة موجزة بالمعروفات المثيرة للاهتمام:

{4AFFC9A0-5F99-101B-AF4E-00AA003F0F07} - Access
{00020905-0000-0000-C000-000000000046} - Word
{00020813-0000-0000-C000-000000000046} - Excel
{91493440-5A91-11CF-8700-00AA0060263B} - Powerpoint
{0002123C-0000-0000-C000-000000000046} - Publisher
{0EA692EE-BB50-4E3C-AEF0-356D91732725} - OneNote 2010+
{F2A7EE29-8BF6-4A6D-83F1-098E366C709C} - OneNote 2007

تم العثور على معرف LIB أعلاه من خلال أداة Windows SDK OLE-COM Object Viewer, ، يمكنك معرفة المزيد من معرف LID باستخدامه.

إن فائدة هذا النهج هو أنه يعمل في جميع إصدارات Office، ويوفر التحكم في كل مكون واحد في اهتمامك. علاوة على ذلك، فإن هذه المفاتيح موجودة في HKEY_CLASSES_ROOT وإدماج عميق في النظام، لذلك من غير المرجح للغاية أن يكونوا متاحين حتى في بيئة رمل.

ملاحظة جيدا: وظيفة الكاشف المذكورة أعلاه لا يعمل. وبعد لدي إصدار 64 بت من Office، وواحد منفصل مع 32. كلا الإصدارين باستخدام هذه الوظيفة إرجاع "32 بت".

التحقق من السجل يؤدي يدويا إلى نفس الاستنتاج: كل من 64 و 32 بت (Office 2010 X64 و Office 2013 32 بت) تقرير 32 بت.

أنا شخصيا أعتقد أن فريق Office يجب أن يكتب ببساطة والحفاظ على مفتاح تسجيل سهل في مكان ما. جميع الحاجة الوظيفة الإضافية للإشارة إلى هذا، و "التخمين" حاليا هو نهج سيء للمطورين المضغوط على الاستخدام.

لا تحتاج إلى البرنامج النصي. انظر إلى هذه الصفحة التي تعثرت عليها:

https://social.msdn.microsoft.com/forums/office/en-us/43499ae0-bcb5-4527-8edb-f5a955987b56/how-to-dec-8thetress-mled-mled-mled-ms-2010-is-32- أو-64 بت؟ المنتدى = WordDev

كي تختصر:

الحقل الرابع في المنتج يشير إلى تلوين المنتج.

{brmmmmmm-pppp-llll-ب000-D00000000FF1CE} P000

0 ل X86، 1 ل X64 0-1 (هذا يحمل أيضا صحيحا ل MSoffice 2013)

ابحث في سجل مسار تثبيت مكون Office الذي تهتم به، على سبيل المثال بالنسبة ل Excel 2010 نظرة في البرامج (WOW6432Node) Microsoft Office 14.0 Excel Installroot. سيكون فقط إما في السجل 32 بت أو سجل 64 بت ليس كلاهما.

مفتاح التسجيل من Outlook Bitness غير موجود على جهازي.

طريقة واحدة لتحديد Bitness Outlook هي فحص Outlook.exe، نفسها وتحديد ما إذا كان 32 بت أو 64 بت.

على وجه التحديد، يمكنك التحقق من [Image_File_Header.machine] [1] والنوع، وسوف يؤدي ذلك إلى إرجاع قيمة معالج تشير إلى القيمة.

للحصول على خلفية ممتازة لهذه المناقشة، عند قراءة رأس PE لقراءة الملف هذا (الرابط القديم), ، التي تنص على؛

هيكل Image_NT_HEADERS هو الموقع الأساسي حيث يتم تخزين تفاصيل ملف PE. يتم إعطاء إزاحةها بواسطة الحقل e_lfanew في image_dos_header في بداية الملف. هناك بالفعل نسختان من هيكل Image_NT_HEADER، واحدة للتنفيذ 32 بت والآخر لإصدارات 64 بت. الاختلافات صغيرة جدا بحيث سأعتبرها أن تكون هي نفسها لأغراض هذه المناقشة. الطريقة الصحيحة الوحيدة والتمييز بين التمييز بين التنسيقتين هي قيمة الحقل السحري في image_optional_header (الموصوف قريبا).

يتألف صورة_NT_HEADER من ثلاثة حقول:

typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

ويمكنك الحصول على رمز C # هنا.

الحقل السحري في بداية هيكل Image_optional_Header، 2 بايت عند إزاحة 24 من بداية _image_nt_headers. لديها قيم 0x10b لمدة 32 بت و 0x20b لمدة 64 بت.

ليس عبر التسجيل ولكن عبر أدوات Commandline:

https://stackoverflow.com/a/6194710/2885897.

C: المستخدمين Me> Assoc .msg

.msg = Outlook.file.msg.15.

C: المستخدمين Me> Ftype Outlook.file.msg.15

Outlook.File.msg.15 = "C: ملفات البرنامج (X86.) Microsoft Office Root Office16 Outlook.exe "/ f"٪ 1 "

أفضل طريقة سهلة: ضع أيقونة حول تطبيق Office 2016. مثال Excel.

1) فتح Excel -> ملف -> خيارات -> تخصيص الشريط

2) سوف ترى 2 قطعة. اختيار الأوامر من & تخصيص الشريط

3) من اختيار الأمر، حدد جميع الأوامر

4) من القائمة الناتجة تسليط الضوء على (Excel)

5) من تخصيص آلام الشريط، قم بتمييز أي عنصر (EX. عرض) حيث تريد وضع أيقونة حول

6) انقر فوق مجموعة جديدة في الأسفل

7) انقر فوق الزر "إضافة" الموجود بين الجزءين. منجز

الآن عند النقر فوق "عرض علامة التبويب" في Excel وانقر فوق "سترى 32 بت أو 64 بت

لقد وجدت طريقة أسهل بكثير. باستخدام PowerShell، يمكننا ربط Excel ككائن COM.

$user = $env:UserName
$msoExcel = New-Object -ComObject Excel.Application  
$msoExcel | Select-Object -Property OperatingSystem | Out-File "\\SERVER\Path\To\Dump\msoVersion-$user.txt"
exit

عند طلب النظام التشغيل بهذه الطريقة، نحصل على نتائج غريبة،إلقاء نظرة هنا. PC3 هو لي.

آمل أن يعمل هذا بالنسبة لك يا رفاق. آسف لعدم وجود رمز؛ البرامج النصية هي في الغالب وظيفية.

يحرر: لا تنس إضافة التعليمات البرمجية لإغلاق Excel بعد الانتهاء من استرداد البيانات.
بعد اختبار هذا الرمز أمس كان لدي الكثير من فتح التفتيش وتحطيم كل فجأة ..
سيؤدي ذلك إلى التأكد من أنك ستحتفظ بالمستخدمين والإيدحوا بالسعادة (:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($msoExcel)
Remove-Variable msoExcel

تحرير: حل دون لمس Registrykeys - أنا آسف OP.

اكتشفت أن هناك حلا في C # - يمكن العثور على الأصل هنا:https:/blogs.msdn.microsoft.com/webdav_101/2016/26/26/26/2666/26666/26666/26/2666/26/26666666666666666666666666666666666666666666666666666666666666662/26

قمت بتعديلها قليلا لاحتياجاتي.

مجرد تمرير OutlookPath الصحيح إلى GetOutlookBitness ()

  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
    }



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




    public int GetOutlookBitness(string FilePath)
    {
        int bitness = 0;

        if (File.Exists(FilePath))
        {
            BinaryType type;
            GetBinaryType(FilePath, out type);


            switch (type)
            {
                case BinaryType.SCS_32BIT_BINARY:
                    bitness = 32;
                    break;
                case BinaryType.SCS_64BIT_BINARY:
                    bitness = 64;
                    break;
            }
        }

        return bitness;



    }

إذا أراد المرء أن يعرف فقط رقم البت فقط إصدار Office 2010 هو، ثم في أي تطبيق من Office 2010، فما عليك سوى النقر فوق الملف، ثم في التعليمات. سيتم سرد معلومات حول رقم الإصدار، وبالتالي، سيكون في قوسين، إما (32 بت) أو (64 بت).

افتح Outlook 2013> ملف> حساب Office> حول Outlook> انقر فوق كبير "؟ حول Outlook" زر> قراءة الوصف المنبثق

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top