You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Delphi代码跨平台检测Visual Studio Code是否已安装?

如何通过Delphi代码跨平台检测Visual Studio Code是否已安装?

我完全懂你的困扰——Windows下靠扫描固定注册表项或安装路径的方法不仅容易失效(比如用户自定义了安装位置,或者用Microsoft Store安装了VS Code),还没法覆盖Mac和Linux平台。你朋友给的那段注册表检测代码没起作用,大概率是因为VS Code的注册表项已经更新了,而且没考虑到32/64位注册表重定向的问题,也没覆盖Store版本的安装情况。

下面我给你一套跨平台的解决方案,分平台处理,每个平台都用更可靠的检测逻辑:

核心思路

最通用的检测逻辑优先检查系统PATH中是否存在code命令(VS Code安装后通常会自动把这个命令加入PATH),其次再检查常见安装路径或系统注册信息,这样既能覆盖自定义安装的情况,也能适配不同平台的特性。

完整跨平台Delphi代码

unit VSCodeDetect;

interface

function IsVSCodeInstalled: Boolean;

implementation

uses
  System.SysUtils, System.IOUtils, System.Classes, System.Process;

{$IFDEF MSWINDOWS}
uses
  Winapi.Windows, Winapi.ShellAPI, System.Win.Registry;
{$ENDIF}

{$IFDEF MACOS}
uses
  Macapi.Foundation, Macapi.AppKit, Macapi.CoreServices;
{$ENDIF}

function IsVSCodeInstalled: Boolean;
{$IFDEF MSWINDOWS}
var
  PathBuffer: array[0..MAX_PATH] of Char;
  CmdOutput: TStringList;
begin
  Result := False;

  // 方法1:检查PATH中是否存在code.exe
  if SearchPath(nil, 'code.exe', nil, MAX_PATH, PathBuffer, nil) > 0 then
  begin
    Result := TFile.Exists(PathBuffer);
    if Result then Exit;
  end;

  // 方法2:检查Microsoft Store版本的注册表项(64位程序或带重定向的32位程序)
  with TRegistry.Create(KEY_READ or KEY_WOW64_64KEY) do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft.VisualStudioCode_8wekyb3d8bbwe') then
    begin
      Result := ValueExists('DisplayName') and (ReadString('DisplayName') = 'Visual Studio Code');
      if Result then Exit;
    end;
  finally
    Free;
  end;

  // 方法3:尝试执行code --version验证命令是否有效
  CmdOutput := TStringList.Create;
  try
    if TProcess.Execute('cmd.exe', '/c code --version', CmdOutput) then
    begin
      // VS Code版本号格式是1.x.x,所以判断首行是否以1.开头
      Result := (CmdOutput.Count > 0) and CmdOutput[0].StartsWith('1.');
    end;
  finally
    CmdOutput.Free;
  end;
end;
{$ENDIF}

{$IFDEF MACOS}
var
  PathBuffer: array[0..MAX_PATH] of Char;
  BundleID: NSString;
  AppURL: NSURL;
begin
  Result := False;

  // 方法1:检查默认应用安装路径
  if TDirectory.Exists('/Applications/Visual Studio Code.app') then
  begin
    Result := True;
    Exit;
  end;

  // 方法2:检查PATH中的code命令
  if SearchPath(nil, 'code', nil, MAX_PATH, PathBuffer, nil) > 0 then
  begin
    Result := TFile.Exists(PathBuffer);
    if Result then Exit;
  end;

  // 方法3:通过Launch Services检查是否注册了VS Code的Bundle ID
  BundleID := NSSTR('com.microsoft.VSCode');
  AppURL := LSSearchForItemURL(nil, kLSRolesAll, BundleID, nil, 0);
  Result := AppURL <> nil;
  if AppURL <> nil then AppURL.release;
end;
{$ENDIF}

{$IFDEF LINUX}
var
  PathBuffer: array[0..MAX_PATH] of Char;
begin
  Result := False;

  // 方法1:检查PATH中的code命令
  if SearchPath(nil, 'code', nil, MAX_PATH, PathBuffer, nil) > 0 then
  begin
    Result := TFile.Exists(PathBuffer);
    if Result then Exit;
  end;

  // 方法2:检查常见系统级安装路径
  if TFile.Exists('/usr/bin/code') or TFile.Exists('/snap/bin/code') then
  begin
    Result := True;
    Exit;
  end;

  // 方法3:检查用户级手动安装路径
  if TDirectory.Exists(TPath.GetHomePath + '/.local/share/code') then
  begin
    Result := True;
    Exit;
  end;

  // 方法4:检查桌面快捷方式文件
  if TFile.Exists(TPath.GetHomePath + '/.local/share/applications/code.desktop') then
  begin
    Result := True;
  end;
end;
{$ENDIF}

end.

关键说明

  1. Windows平台注意事项

    • 之前的代码失败很可能是因为32位Delphi程序默认只能访问32位注册表,而64位VS Code的注册表项在64位分支里,所以要加KEY_WOW64_64KEY标志来访问64位注册表。
    • Microsoft Store安装的VS Code注册表项和传统安装版不同,需要单独检测那个带8wekyb3d8bbwe后缀的键。
  2. MacOS平台注意事项

    • 用Launch Services检查Bundle ID的方法最准确,即使用户把VS Code安装在非默认路径(比如~/Applications)也能检测到。
    • code命令是VS Code安装时自动创建的软链接,指向应用包内的可执行文件。
  3. Linux平台注意事项

    • 覆盖了apt安装、Snap安装、手动解压安装三种常见场景,基本能覆盖绝大多数用户的安装情况。

使用的时候,你只需要调用IsVSCodeInstalled函数就能得到布尔结果,完全符合你想要的简洁接口。

内容来源于stack exchange

火山引擎 最新活动