Lazarus打开外部程序的标准方式

Pascal/Delphi wes 14 hours ago (2026-08-05) 15 views
📑 本文导航
在 Lazarus 中打开外部程序有多种方法,选择哪种取决于你的具体需求。

下面是几种主流方法的对比和详细用法。

⚖️ 方法对比与选择

方法 跨平台 同步/异步 主要用途
OpenDocument ✅ 是 异步 最推荐:用系统默认程序打开文件或URL。
TProcess ✅ 是 异步 最强大:需要控制外部程序(如获取输出、传参、等待结束)。
SysUtils.ExecuteProcess ✅ 是 同步 最简单:简单的“运行并等待”场景。
ShellExecute ❌ 否 (仅Windows) 异步 Windows下功能丰富,如以管理员权限运行。

🛠️ 常用方法详解

1. OpenDocument (LCLIntf) —— 跨平台“打开”的首选

这是打开文档、图片、URL等最便捷的方式,它会自动调用系统关联的程序。

  • 使用前:在单元的 uses 子句中添加 LCLIntf

  • 用法示例

    pascal
    uses
     LCLIntf; // 必须添加此单元
    // 用默认浏览器打开网页
    OpenDocument('https://www.example.com');
    // 用默认图片查看器打开图片
    OpenDocument('C:\Users\YourName\Pictures\photo.jpg');
    // 用默认PDF阅读器打开PDF
    OpenDocument('C:\Documents\report.pdf');

2. TProcess (Process) —— 功能最强大的跨平台方案

当需要精细控制外部进程时(如执行带参数的命令、读取输出),TProcess 是标准做法。

  • 使用前:在单元的 uses 子句中添加 Process

  • 基础用法(异步执行)

    pascal
    uses
     Process; // 必须添加此单元
    procedure RunNotepad;
    var
     RunProgram: TProcess;
    begin
     RunProgram := TProcess.Create(nil);
     try
     RunProgram.CommandLine := 'notepad.exe'; // 设置要运行的程序
     RunProgram.Execute; // 执行程序(不等待,立即返回)
     finally
     RunProgram.Free;
     end;
    end;

    代码参考自

  • 高级用法(等待结束并获取输出)

    pascal
    uses
     Process;
    procedure RunCommandAndWait;
    var
     RunProgram: TProcess;
     OutputLines: TStringList;
    begin
     RunProgram := TProcess.Create(nil);
     OutputLines := TStringList.Create;
     try
     RunProgram.CommandLine := 'ping 127.0.0.1 -n 3'; // Windows命令
     RunProgram.Options := RunProgram.Options + [poWaitOnExit, poUsePipes]; // 等待并捕获输出
     RunProgram.Execute; // 执行并等待结束
     OutputLines.LoadFromStream(RunProgram.Output); // 读取输出结果
     // 在这里处理 OutputLines.Text
     finally
     OutputLines.Free;
     RunProgram.Free;
     end;
    end;

3. SysUtils.ExecuteProcess —— 最简单的同步执行

如果只是简单地运行一个程序并等待它结束,这是最直接的方法。

  • 使用前:在单元的 uses 子句中添加 SysUtils

  • 用法示例

    pascal
    uses
     SysUtils;
    procedure RunNotepadSync;
    begin
     // 执行 notepad.exe 并等待其关闭
     SysUtils.ExecuteProcess('notepad.exe', '', []);
    end;

    代码参考自

4. ShellExecute (ShellApi) —— Windows 专属高级功能

当需要在 Windows 下实现特殊功能时(如以管理员权限运行),可以使用此 API。

  • 使用前:在单元的 uses 子句中添加 ShellApi

  • 用法示例

    pascal
    uses
     ShellApi;
    procedure OpenWithElevated;
    begin
     // 以管理员权限运行命令提示符
     ShellExecute(0, 'runas', 'cmd.exe', nil, nil, SW_SHOWNORMAL);
    end;

💎 总结与建议

  • 最常用:对于绝大多数“打开”场景(文件、网址),直接用 OpenDocument

  • 最强大:需要执行带参数的命令、读取输出或精细控制时,使用 TProcess

  • 最简单:只需同步运行一个程序并等待其结束,用 SysUtils.ExecuteProcess

  • 最特殊:仅在 Windows 下需要提权等特殊操作时,考虑 ShellExecute

  •