3

Microsoft は最近、Excel のバージョンと現在の omacro セキュリティ レベルを読み取るために、長年の (そして公式に推奨されている) コードを壊しました。

以前は機能していたもの:

// 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'

(セキュリティレベルが安全でないレジストリエントリで何年もの間だったことをいつも面白がっていました...)

Office 2010 では、.xls ファイルは「Microsoft Application Virtualization DDE Launcher」または sftdde.exe に関連付けられるようになりました。この exe のバージョン番号は、明らかに Excel のバージョンではありません。

私の質問:

実際に Excel を起動し、バージョンセキュリティレベルをクエリする (OLE CreateOLEObject('Excel.Application') を使用) 以外に、Excel 2003 以降のすべてのバージョンで機能する、クリーンで高速、または信頼性の高い方法はありますか? ?

4

2 に答える 2

4

使用する

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;

excel.exe ファイルの完全なファイル名を取得します。その後はGetFileVersionInfo通常通りご利用ください。

私の知る限り、このアプローチは常に機能します。

于 2010-08-17T21:53:50.340 に答える
1

OLE の使用 CreateOLEObject('Excel.Application'))

この関数が使用するのと同じレジストリの場所を使用して、インストールされている Excel のバージョンを取得できます。基本的に、その関数レジストリ コードの大部分を複製する必要があります。Microsoft Process MonitorWindows がインストールされた Excel をどのように検索するかを正確に確認し、まったく同じ方法で実行するなどのツールを使用して、その関数呼び出しをスパイすることができます。

でレジストリを開きHKEY_CLASSES_ROOT\、名前が「Excel.Application」で始まるすべてのブランチを列挙する必要があります。

たとえば、この私のワークステーションには Excel 2013 しかインストールされておらず、それは HKEY_CLASSES_ROOT\Excel.Application.15 に対応しています。

しかし、私の別のワークステーションには Excel 2003 と Excel 2010 がインストールされており、これら 2 つの異なる XLSX 実装をテストしているため、2 つのレジストリ キーがあります。

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

したがって、その名前、ドット、および番号を持つすべてのブランチを列挙する必要があります。

注: キー HKEY_CLASSES_ROOT\Excel.Application\CurVer の名前は "default" Excel ですが、複数の Excel がインストールされている場合、"default" の意味はあいまいです。気にしない場合は、そのデフォルト値を使用することも、Excel の最大バージョンまたは最小バージョンなどが必要な場合など、何を選択するかを独自に決定することもできます。

次に、特定の Excel ブランチごとに、その CLSID サブブランチのデフォルト キーを読み取る必要があります。Like HKEY_CLASSES_ROOT\Excel.Application.15\CLSIDhas nil-named key equal to {00024500-0000-0000-C000-000000000046}- そのインデックスを文字列変数にフェッチします。

次に、2 回目の検索を行います。like という名前のブランチに移動しHKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServerます (取得したインデックスを使用します)。

そのブランチが存在する場合 - nil という名前の「デフォルト キー」値をフェッチして、次のようなものを取得します。C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

最後の結果はコマンド ラインです。ファイル名 (この例では引用符で囲まれていませんが、引用符で囲まれている場合があります) で始まり、オプションのコマンド ラインが続きます。コマンドラインは必要ないので、引用符で囲まれているかどうかにかかわらず、最初のコマンドラインを抽出する必要があります。

次に、そのようなexeファイルが存在するかどうかを確認する必要があります。実行されている場合は起動できますが、実行されていない場合は、レジストリで他の Excel バージョンを確認してください。

于 2017-05-04T17:43:57.993 に答える