Flutter写Win Plugin调用第三方exe后台运行-开发技巧分享
2023-11-21 18:46:55
在 Flutter 应用程序中调用第三方 exe 并保持其后台运行
简介
作为一名 Flutter 开发者,您可能会遇到需要在应用程序中调用第三方可执行文件 (exe) 的情况,并希望该 exe 在后台继续运行。本文将逐步指导您完成在 Flutter 应用程序中创建 Windows 插件、在插件中调用第三方 exe 并保持其后台运行所需的步骤。
步骤 1:创建 Flutter 项目和 Windows 插件
首先,在命令提示符中使用以下命令创建一个新的 Flutter 项目:
flutter create win_plugin
接下来,使用以下命令在该项目中创建一个 Windows 插件:
flutter create -p windows win_plugin
步骤 2:在 Windows 插件中添加代码
在 win_plugin 文件夹中,打开 main.cpp 文件并添加以下代码:
#include <windows.h>
#include <flutter/plugin_registrar_windows.h>
// 定义将由 Flutter 调用的函数。
void Hello(const FlutterArguments *args, FlutterReply *reply) {
// 从 Flutter 参数中获取消息。
const char *message = flutter::StringForArgument(args, "message");
// 创建一个 Windows 消息框来显示消息。
MessageBoxA(NULL, message, "Hello from Flutter!", MB_OK);
// 设置要发送回 Flutter 的回复。
flutter::SetReplyString(reply, "Hello from Windows!");
}
// 向 Flutter 插件注册器注册函数。
void RegisterPlugin(FlutterDesktopPluginRegistrarRef registrar) {
// 定义插件将通过其进行通信的通道的名称。
const char *channel_name = "win_plugin";
// 使用插件注册器注册函数。
flutter::PluginRegistrarWindows *registrar_windows =
flutter::PluginRegistrarWindows::GetInstance();
registrar_windows->RegisterPlugin(channel_name, Hello);
}
步骤 3:在 Flutter 应用程序中使用 Windows 插件
在 Flutter 应用程序的 pubspec.yaml 文件中,添加对 win_plugin 包的依赖:
dependencies:
win_plugin: ^1.0.0
然后,在您的 Dart 代码中导入 win_plugin 包并使用它:
import 'package:win_plugin/win_plugin.dart';
void main() {
// 创建一个 WinPlugin 实例。
final WinPlugin winPlugin = WinPlugin();
// 调用 Hello 函数。
winPlugin.hello("Hello from Flutter!");
}
步骤 4:运行 Flutter 应用程序
使用以下命令运行您的 Flutter 应用程序:
flutter run
步骤 5:验证 Windows 插件是否正常工作
当 Flutter 应用程序运行时,您应该会看到一个 Windows 消息框,上面写着"Hello from Flutter!"。
步骤 6:调用第三方 exe
要调用第三方 exe,请在 Windows 插件中使用 ShellExecute() 函数。例如:
// 从 Flutter 参数中获取 exe 路径。
const char *exe_path = flutter::StringForArgument(args, "exe_path");
// 调用第三方 exe。
HINSTANCE result = ShellExecuteA(NULL, NULL, exe_path, NULL, NULL, SW_MINIMIZE);
if (result <= (HINSTANCE)32) {
// 出错时返回错误消息。
flutter::SetReplyString(reply, "Failed to execute exe.");
return;
}
// 设置要发送回 Flutter 的回复。
flutter::SetReplyString(reply, "Exe executed successfully.");
步骤 7:让 exe 在后台运行
您可以通过将 SW_HIDE 标志传递给 ShellExecute() 函数来让 exe 在后台运行:
HINSTANCE result = ShellExecuteA(NULL, NULL, exe_path, NULL, NULL, SW_HIDE);
常见问题解答
1. 如何传递参数给第三方 exe?
您可以通过 ShellExecute() 函数的第四个参数向第三方 exe 传递参数。
2. 如何获取第三方 exe 的输出?
您可以使用 CreatePipe() 和 ReadFile() 函数创建管道并从第三方 exe 中读取输出。
3. 如何处理第三方 exe 的退出代码?
当第三方 exe 完成运行时,您可以使用 GetExitCodeProcess() 函数获取其退出代码。
4. 如何让第三方 exe 保持后台运行?
您可以使用 SW_HIDE 标志调用 ShellExecute() 函数,或使用 JobObject API 创建一个新作业对象来保持第三方 exe 在后台运行。
5. 如何调试 Windows 插件?
您可以使用 Visual Studio Code 或 Windows 调试工具调试 Windows 插件。
结论
通过遵循本文中概述的步骤,您可以轻松地在 Flutter 应用程序中创建 Windows 插件,调用第三方 exe 并保持其在后台运行。这将极大地扩展 Flutter 应用程序的功能,使您能够执行更复杂的任务。