Răsfoiți Sursa

增加进程操作

xx 2 ani în urmă
părinte
comite
f6e1e3817d
2 a modificat fișierele cu 134 adăugiri și 0 ștergeri
  1. 82 0
      src/module/process.cpp
  2. 52 0
      src/module/process.h

+ 82 - 0
src/module/process.cpp

@@ -0,0 +1,82 @@
+#include "process.h"
+#include "util/process.h"
+#ifdef _WIN32
+#include <Windows.h>
+#endif
+size_t module::process::create(const std::string& filepath, const std::string& working_directory, sol::table args, bool wait_close, bool show_window)
+{
+    std::vector<std::string> vs_args;
+    for (auto& pair : args) {
+        if (pair.second.get_type() != sol::type::string)
+        {
+            throw ylib::exception("`args ` only supports string type");
+        }
+        vs_args.push_back(pair.second.as<std::string>());
+    }
+
+    size_t pid = 0;
+    if (ylib::process::create(filepath, working_directory, vs_args, wait_close, show_window, &pid) == false)
+        return 0;
+    return pid;
+}
+
+bool module::process::destory(size_t pid)
+{
+    return ylib::process::destory(pid);
+}
+
+sol::table module::process::list(sol::this_state s)
+{
+    sol::state_view lua(s);
+    sol::table result_table = lua.create_table();
+    int row_num = 1;
+    auto pl = ylib::process::list();
+    for_iter(iter, pl)
+    {
+        sol::table row = lua.create_table();
+        row["name"] = iter->name;
+        row["parent_pid"] = iter->parent_pid;
+        row["path"] = iter->path();
+        row["pid"] = iter->pid;
+        result_table[row_num++] = row;
+    }
+    return result_table;
+}
+
+size_t module::process::exist(const std::string& filepath)
+{
+    return ylib::process::exist(filepath);
+}
+
+bool module::process::exist_pid(size_t pid)
+{
+#ifdef _WIN32
+    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+    if (hProcess != nullptr) {
+        // 进程存在,关闭句柄并返回true
+        CloseHandle(hProcess);
+        return true;
+    }
+    // 进程不存在
+    return false;
+#else
+    return false;
+#endif
+}
+
+std::string module::process::getpath(size_t pid)
+{
+    return ylib::process::getpath(pid);
+}
+
+void module::process::regist(sol::state* lua)
+{
+    lua->new_usertype<module::process>("process",
+        "create", &module::process::create,
+        "destory", &module::process::destory,
+        "exist", &module::process::exist,
+        "exist_pid", &module::process::exist_pid,
+        "getpath", &module::process::getpath,
+        "list", &module::process::list
+    );
+}

+ 52 - 0
src/module/process.h

@@ -0,0 +1,52 @@
+#pragma once
+#include "sol/sol.hpp"
+
+namespace module
+{
+	/// <summary>
+	/// 进程
+	/// </summary>
+	class process{
+	public:
+		/// <summary>
+		/// 创建
+		/// </summary>
+		/// <param name="filepath"></param>
+		/// <param name="working_directory"></param>
+		/// <param name="args"></param>
+		/// <param name="wait_close"></param>
+		/// <param name="show_window"></param>
+		/// <returns>0=失败 否则为PID</returns>
+		static size_t create(const std::string & filepath, const std::string & working_directory,sol::table args, bool wait_close, bool show_window);
+		/// <summary>
+		/// 关闭
+		/// </summary>
+		/// <param name="pid"></param>
+		/// <returns></returns>
+		static bool destory(size_t pid);
+		/// <summary>
+		/// 进程列表
+		/// </summary>
+		/// <param name="s"></param>
+		/// <returns></returns>
+		static sol::table list(sol::this_state s);
+		/// <summary>
+		/// 是否存在
+		/// </summary>
+		/// <param name="filepath"></param>
+		/// <returns></returns>
+		static size_t exist(const std::string& filepath);
+		static bool exist_pid(size_t pid);
+		/// <summary>
+		/// 取PID路径
+		/// </summary>
+		/// <param name="pid"></param>
+		/// <returns></returns>
+		static std::string getpath(size_t pid);
+
+
+		static void regist(sol::state* lua);
+	};
+
+}
+