|
6 | 6 | #include <napi.h> |
7 | 7 | #include <windows.h> |
8 | 8 |
|
9 | | -static Napi::Value ApiConsoleProcessList(const Napi::CallbackInfo& info) { |
| 9 | +static Napi::Promise ApiConsoleProcessList(const Napi::CallbackInfo& info) { |
10 | 10 | Napi::Env env(info.Env()); |
11 | 11 | if (info.Length() != 1 || |
12 | 12 | !info[0].IsNumber()) { |
13 | 13 | throw Napi::Error::New(env, "Usage: getConsoleProcessList(shellPid)"); |
14 | 14 | } |
15 | 15 |
|
16 | 16 | const DWORD pid = info[0].As<Napi::Number>().Uint32Value(); |
17 | | - |
| 17 | + // 创建一个 Promise 对象 |
| 18 | + Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(env); |
18 | 19 | if (!FreeConsole()) { |
19 | | - throw Napi::Error::New(env, "FreeConsole failed"); |
20 | | - } |
21 | | - if (!AttachConsole(pid)) { |
22 | | - throw Napi::Error::New(env, "AttachConsole failed"); |
| 20 | + deferred.Reject(Napi::String::New(deferred.Env(),"FreeConsole failed")); |
23 | 21 | } |
24 | | - auto processList = std::vector<DWORD>(64); |
25 | | - auto processCount = GetConsoleProcessList(&processList[0], static_cast<DWORD>(processList.size())); |
26 | | - if (processList.size() < processCount) { |
27 | | - processList.resize(processCount); |
28 | | - processCount = GetConsoleProcessList(&processList[0], static_cast<DWORD>(processList.size())); |
| 22 | + if (!AttachConsole(pid)) { // todo 这都是操当前的,不太行 |
| 23 | + deferred.Reject(Napi::String::New(deferred.Env(),"AttachConsole failed")); |
29 | 24 | } |
30 | | - FreeConsole(); |
| 25 | + std::thread([pid,deferred]() mutable { |
| 26 | + // 执行耗时任务 |
| 27 | + try { |
31 | 28 |
|
32 | | - Napi::Array result = Napi::Array::New(env); |
33 | | - for (DWORD i = 0; i < processCount; i++) { |
34 | | - result.Set(i, Napi::Number::New(env, processList[i])); |
35 | | - } |
36 | | - return result; |
| 29 | + |
| 30 | + auto processList = std::vector<DWORD>(64); |
| 31 | + auto processCount = GetConsoleProcessList(&processList[0], static_cast<DWORD>(processList.size())); |
| 32 | + if (processList.size() < processCount) { |
| 33 | + processList.resize(processCount); |
| 34 | + processCount = GetConsoleProcessList(&processList[0], static_cast<DWORD>(processList.size())); |
| 35 | + } |
| 36 | + FreeConsole(); |
| 37 | + Napi::Array result = Napi::Array::New(deferred.Env()); |
| 38 | + for (DWORD i = 0; i < processCount; i++) { |
| 39 | + result.Set(i, Napi::Number::New(deferred.Env(), processList[i])); |
| 40 | + } |
| 41 | + deferred.Resolve(result); |
| 42 | + } catch (const std::exception& e) { |
| 43 | + deferred.Reject(Napi::String::New(deferred.Env(), e.what())); |
| 44 | + } |
| 45 | + }).detach(); // 分离线程,这样线程会在后台运行 |
| 46 | + return deferred.Promise(); |
37 | 47 | } |
38 | 48 |
|
39 | 49 | Napi::Object init(Napi::Env env, Napi::Object exports) { |
|
0 commit comments