質問

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から始まるすべてのバージョンで動作するよりクリーンで、より高速で、またはより信頼できるこれを行う方法はありますか?

役に立ちましたか?

解決

使用する

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 いつものように。

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

他のヒント

ole createoleObject( 'excel.application')を使用する)

この関数が使用する同じレジストリプレイスを使用して、インストールされたExcelバージョンを取得できます。基本的に、その関数レジストリコードの大部分をクローンする必要があります。あなたはそのようなツールでその関数呼び出しをスパイすることができます Microsoft Process Monitor また、Windowsがインストールされた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には「デフォルト」Excelの名前がありますが、いくつかのExcelがインストールされている場合、「デフォルト」の意味はあいまいです。気にしない場合は、そのデフォルト値を取得するか、最大のExcelバージョンや最小限などが必要な場合のように、自分のアイデアを選択することができます。

次に、特定のExcelブランチごとにいつ読むべきですか デフォルトキー Clsidサブブランチの。好き HKEY_CLASSES_ROOT\Excel.Application.15\CLSID 名前のないキーがあります{00024500-0000-0000-C000-000000000046} - そのインデックスを文字列変数に取得します。

次に、2回目の検索を行います - 次の名前のブランチに移動します HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer (Fetched Indexを使用してください)

そのブランチが存在する場合 - 名前が付けられた「デフォルトキー」値を取得して、 C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top