52 votes

Détecter si Office est 32 ou 64 bits via le registre

Maintenant qu'Office est également disponible en version 64 bits, où se trouve le registre pour savoir si la version d'Office installée est 32 ou 64 bits ?

52voto

Todd Main Points 24036

Extrait de l'article de TechNet sur Éditions 64 bits d'Office 2010 :

Si vous avez installé Office 2010 y compris Microsoft Outlook 2010, Outlook définit une clé de registre nommée Témoin de type REG_SZ sur l'ordinateur sur lequel il est installé. Le site Témoin La clé de registre indique si l'installation d'Outlook 2010 est 32 bits ou 64 bits. Cela peut être utile pour les administrateurs qui sont intéressés par l'audit des ordinateurs pour déterminer les versions installées d'Office Office 2010 dans leur organisation.

  • Chemin du registre : HKEY_LOCAL_MACHINE \Software\Microsoft\Office\14.0\Outlook
  • si vous avez installé Office 2013, utilisez ceci Chemin du registre : HKEY_LOCAL_MACHINE \Software\Microsoft\Office\15.0\Outlook
  • Clé de registre : Témoin
  • Valeur : x86 ou x64

et ailleurs dans le même article :

À partir d'Office 2010, Outlook est disponible en tant qu'application 32 bits et une application 64 bits. La version (bitness) d'Outlook que vous choisissez dépend de l'édition du système d'exploitation (32 bits ou 64 bits) et de l'édition d'Office 2010 (32- ou 64 bits) qui est installée sur l'ordinateur ordinateur, si Office est déjà déjà installé sur cet ordinateur.

Facteurs qui déterminent la faisabilité d'installer une version 32 bits ou 64 bits d'Outlook sont les suivants suivants :

  • Vous pouvez installer la version 32 bits d'Office 2010 et la version 32 bits de Microsoft Outlook 2010 sur une édition 32 bits ou 64 bits prise en charge du système d'exploitation Windows. Vous pouvez installer la version 64 bits d'Office 2010 et la version 64 bits d'Outlook 2010 uniquement sur un système d'exploitation 64 bits pris en charge.
  • L'installation par défaut d'Office 2010 sur une édition 64 bits du système d'exploitation Windows est Office 2010 32 bits.
  • Le bitness d'une version installée d'Outlook est toujours le même que le bitness d'Office 2010, si Office est installé sur le même ordinateur. Autrement dit, une version 32 bits d'Outlook 2010 ne peut pas être installée sur le même ordinateur sur lequel des versions 64 bits d'autres applications Office 2010 sont déjà installées, telles que Microsoft Word 2010 64 bits ou Microsoft Excel 2010 64 bits. De même, une version 64 bits d'Outlook 2010 ne peut pas être installée sur le même ordinateur sur lequel des versions 32 bits d'autres applications Office sont déjà installées.

2 votes

Dans mon environnement de test, cette clé de registre Bitness n'est pas présente si l'installation a été effectuée à partir d'un fichier de type autonome Support d'installation d'Excel x64 (c'est-à-dire EXCEL 2010 autonome). On peut supposer que si le paquet d'installation dispose d'Outlook, le champ Bitness est inséré, mais si Outlook n'est même pas une option, vous ne pouvez pas compter sur cette clé.

1 votes

Ajoutez 16.0 dans le chemin d'accès à Office 2016.

2 votes

Cela ne semble pas fonctionner pour 2016. Lorsqu'Office 32 bits est installé sur une machine 64 bits, l' HKEY_LOCAL_MACHINE\Software\Microsoft\Office\16.0\Outlook\Bi‌​tness n'existe pas. HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Office\16.‌​0\Outlook\Bitness le fait, cependant.

23voto

TodK Points 979

J'ai testé la réponse d'Otaku et il apparaît que la valeur de bitume d'Outlook est définie même si Outlook n'est pas installé, même si l'article référencé n'indique pas clairement que ce serait le cas.

11 votes

Du bon travail. Il est travail notant que sur une machine 64 bits, les valeurs de bitness existe à la fois dans : HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\Office\14.0\Outlook et HKEY_LOCAL_MACHINE \SOFTWARE\Wow6432Node\Microsoft\Office\14. 0 \Outlook ce qui signifie que vous n'avez pas à vous soucier de la redirection Wow64 à partir d'un projet d'installation 32 bits.

0 votes

Lorsque Office 2010 est installé sans Outlook... D'après mes tests, sur une machine Win7 64bit, Bitness est présent. Sur un poste WinXP 32bit, Bitness n'est pas présent.

1 votes

J'ai vérifié mes paramètres de registre, et je n'ai pas de bitness ou d'informations liées à Outlook. J'ai installé Office 2010 64 bits, mais je n'ai pas installé Outlook.

12voto

MB. Points 2847

Pour compléter la réponse de vtrz, voici une fonction que j'ai écrite pour 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;

2 votes

+1 Bien que vous devriez utiliser la version Unicode GetBinaryTypeW voir aussi ma réponse à Obtenir la version et la plate-forme de l'application Office à partir du registre Windows .

9voto

vtrz Points 193

J'ai le regret de vous dire que les méthodes d'Otacku et de @clatonh ne fonctionnent pas pour moi - ni Outlook Bitness, ni {90140000-0011-0000- 1000 -0000000FF1CE} dans le registre (pour Office 64 bits sans Outlook installé).

Le seul moyen que j'ai trouvé, sans passer par le registre, est de vérifier le bitness pour l'un des exécutables d'Office en utilisant la fonction de l'API Windows. GetBinaryType (depuis Windows 2000 Professionnel).

Par exemple, vous pouvez vérifier le bitness de Winword.exe, dont le chemin est stocké sous
HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\Windows\CurrentVersion\App Chemins d'accès \Winword.exe.

Voici le fragment de code 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
}

0 votes

Oui, c'est ce que j'ai fini par faire. C'est dommage car ce n'est généralement pas cool en tant qu'action... personnalisée dans un package d'installation Windows. Le contrôle de version devrait juste être une recherche regpath... IIRC les choses sont devenues encore plus bizarres avec les installateurs d'Office365... hacks sur hacks sur hacks qui se passent là.

6voto

chksr Points 31

Attention : interrogation de l'état de l'application Outlook ne fonctionne PAS de manière fiable si elle est appelée dans l'environnement .NET.

Ici, nous utilisons GetBinaryType() dans une DLL qui peut être appelée par n'importe quelle application :

  • Si l'application hôte est C/C++ 64 bits, GetBinaryType() renvoie SCS_32BIT_BINARY.
  • Si l'application hôte est un .NET 64 bits (nous avons testé "AnyCPU" sur un système 64 bits), GetBinaryType() renvoie SCS_64BIT_BINARY.

Avec exactement le même code DLL et exactement le même chemin binaire Outlook ("c:/Program Files (x86)/...") sur le même ordinateur.

Cela signifie que vous devrez peut-être tester le fichier binaire vous-même en utilisant l'entrée "IMAGE_NT_HEADERS.FileHeader.Machine".

Mon Dieu, je déteste les valeurs de retour incorrectes de certaines API Windows (voir aussi le mensonge GetVersion()).

1 votes

Êtes-vous sûr que vous ne tombez pas dans la virtualisation du registre WOW64 à cause d'une entrée incorrecte dans le manifeste de l'application ?

0 votes

`GetBinaryType()' et la virtualisation du registre ? Je ne m'attendrais pas à ce que ça change quoi que ce soit, surtout si le chemin est donné exactement, de toute façon il n'y a pas d'EXE dans l'autre bitness du système, donc ça doit être une sorte de magie (joli mot pour ces sales tours de Windows), mais pas de magie de registre.

0 votes

J'utilise c# pour appeler kernel32.dll GetBinaryType(). mon test montre que la version x86 peut détecter correctement le bitness binaire, mais pas la version x64.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X