2010-08-17 3 views
3

Microsoft a récemment cassé notre code depuis longtemps (et officiellement recommandé par eux) pour lire la version d'Excel et son niveau actuel de sécurité omacro.Comment obtenir la version d'Excel et le niveau de sécurité des macros

Ce qui travaillait:

// Get the program associated with workbooks, e.g. "C:\Program Files\...\Excel.exe" 
SHELLAPI.FindExecutable('OurWorkbook.xls', ...) 

// Get the version of the .exe (from it's Properties...) 
WINDOWS.GetFileVersionInfo() 

// Use the version number to access the registry to determine the security level 
// '...\software\microsoft\Office\' + VersionNumber + '.0\Excel\Security' 

(je suis toujours amusée que le niveau de sécurité a été pendant des années dans une entrée de registre non sécurisé ...)

Dans Office 2010, les fichiers .xls sont maintenant associé à "" Microsoft Application Virtualization DDE Launcher "ou sftdde.exe. Le numéro de version de cet exe n'est évidemment pas la version d'Excel.

Ma question:

Autre que fait le lancement d'Excel et pour l'interrogation la version et sécurité niveau (en utilisant OLE CreateOleObject ('Excel.Application')), est-il plus propre, plus rapide, ou un moyen plus fiable de faire cela qui fonctionnerait avec toutes les versions à partir d'Excel 2003?

Répondre

4

Utilisez

function GetExcelPath: string; 
begin 
    result := ''; 
    with TRegistry.Create do 
    try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', false) then 
     result := ReadString('Path') + 'excel.exe'; 
    finally 
     Free; 
    end; 
end; 

pour obtenir le nom de fichier complet du fichier excel.exe. Ensuite, utilisez GetFileVersionInfo comme d'habitude. Pour autant que je sache, cette approche fonctionnera toujours.

+0

Merci, Andreas. C'est exactement ce dont j'avais besoin. Notez qu'il existe des parenthèses de fermeture mal placées. Il devrait se lire: résultat: = ReadString ('Path') + 'excel.exe'; – RobertFrank

+0

@ Tom1952: Très vrai. Corrigée. –

+0

Cette réponse n'est plus exacte, si jamais elle l'était. Ce chemin de registre n'existe pas. – GolezTrol

1

utilisant OLE versions CreateOleObject ('Excel.Application'))

vous pouvez obtenir installé Excel en utilisant le même lieu de registre, que cette fonction utilise. Fondamentalement, vous devez cloner une grande partie de ce code de registre de fonction. Vous pouvez espionner cet appel de fonction à l'aide d'outils tels que Microsoft Process Monitor pour voir exactement comment Windows recherche Excel installé, puis le faire exactement de la même manière.

Vous devez ouvrir le registre à HKEY_CLASSES_ROOT\ et énumérer toutes les branches, dont le nom commence par "Excel.Application".

Par exemple à ce mon poste de travail je ne Excel 2013 installé, et qui correspond à HKEY_CLASSES_ROOT \ Excel.Application.15

Mais sur mon autre poste de travail je Excel 2003 et Excel 2010 est installé, tester différentes implémentations XLSX dans ces deux, j'ai donc deux clés de registre.

HKEY_CLASSES_ROOT \ Excel.Application.12 HKEY_CLASSES_ROOT \ Excel.Application.14

Donc, vous devez énumérer toutes les branches avec ce nom, point, et le numéro.

Remarque: la clé HKEY_CLASSES_ROOT \ Excel.Application \ CurVer doit avoir le nom "par défaut" Excel, mais ce que signifie "par défaut" est ambigu lorsque plusieurs Excels sont installés. Vous pouvez prendre cette valeur par défaut, si vous ne vous souciez pas, ou vous pouvez décider de votre propre idée de ce que vous choisissez, comme si vous voulez la version Excel maximale ou minimum ou quelque chose.

Ensuite, lorsque pour chaque branche Excel spécifique, vous devriez lire la clé par défaut de sa sous-branche CLSID. Comme HKEY_CLASSES_ROOT\Excel.Application.15\CLSID a clé Nil égale à {00024500-0000-0000-C000-000000000046} - récupère cet index à la variable de chaîne.

Effectuez ensuite une deuxième recherche - aller dans une branche nommée comme HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer (utiliser l'index tiré par les cheveux)

Si cette branche existe - récupérer la valeur « clé par défaut » nul nommé pour obtenir quelque chose comme C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

Le dernier résultat est la ligne de commande. Il commence par un nom de fichier (non cité dans cet exemple, mais peut être entre guillemets) et est suivi d'une ligne de commande optionnelle. Vous n'avez pas besoin de ligne de commande, vous devez donc extraire le lien initial, cité ou non.

Ensuite, vous devez vérifier si un tel fichier exe existe. Si c'est le cas - vous pouvez le lancer, sinon - vérifiez le registre pour d'autres versions d'Excel.

Questions connexes