🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
ShellCOMUtils.hpp
浏览该文件的文档.
1
11
12#pragma once
13
14#if defined(_WIN32) && !defined(SWIG)
15
16#include "AstGlobal.h"
17
18#include <Windows.h>
19#include <shellapi.h>
20#include <shlobj.h>
21#include <string>
22
23AST_NAMESPACE_BEGIN
24
30inline void aShellPumpMessages(unsigned long waitMs)
31{
32 unsigned long start = GetTickCount();
33
34 while ((GetTickCount() - start) < waitMs)
35 {
36 MSG msg;
37 while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE))
38 {
39 TranslateMessage(&msg);
40 DispatchMessageW(&msg);
41 }
42 unsigned long elapsed = GetTickCount() - start;
43 DWORD remain = (elapsed < waitMs) ? (DWORD)(waitMs - elapsed) : 0;
44 if (remain > 50) remain = 50; // 分段等待,避免错过队列中的消息
45 MsgWaitForMultipleObjectsEx(0, nullptr, remain, QS_ALLINPUT,
46 MWMO_INPUTAVAILABLE);
47 }
48}
49
55inline std::wstring aShellItemRealName(FolderItem* pItem)
56{
57 if (!pItem) return std::wstring();
58
59 BSTR bstrPath = nullptr;
60 if (SUCCEEDED(pItem->get_Path(&bstrPath)) && bstrPath)
61 {
62 std::wstring path(bstrPath, SysStringLen(bstrPath));
63 SysFreeString(bstrPath);
64 size_t pos = path.find_last_of(L"\\/");
65 if (pos != std::wstring::npos)
66 {
67 if (pos + 1 < path.size()) return path.substr(pos + 1);
68 }
69 else if (!path.empty())
70 {
71 return path; // 没有分隔符,Path 本身就是名字
72 }
73 }
74
75 // 退路:Path 拿不到时退回显示名称(少数命名空间未实现 Path)
76 BSTR bstrName = nullptr;
77 if (SUCCEEDED(pItem->get_Name(&bstrName)) && bstrName)
78 {
79 std::wstring name(bstrName, SysStringLen(bstrName));
80 SysFreeString(bstrName);
81 return name;
82 }
83 return std::wstring();
84}
85
86
90// 这里把 UI 全部关掉,完成与否只由 aShellWaitForItem 轮询判定
91constexpr long kShellComCopyFlags = FOF_NO_UI;
92
95constexpr unsigned long kShellComWaitTimeoutMs = 60000;
96
102inline bool aShellWaitForItem(Folder* pFolder, const std::wstring& itemName, unsigned long timeoutMs = kShellComWaitTimeoutMs)
103{
104 unsigned long start = GetTickCount();
105
106 while ((GetTickCount() - start) < timeoutMs)
107 {
108 FolderItem* pCheck = nullptr;
109 BSTR bstrName = SysAllocString(itemName.c_str());
110 if (!bstrName) return false;
111 HRESULT hr = pFolder->ParseName(bstrName, &pCheck);
112 SysFreeString(bstrName);
113
114 if (SUCCEEDED(hr) && pCheck != nullptr)
115 {
116 pCheck->Release();
117 return true;
118 }
119 aShellPumpMessages(100);
120 }
121 return false;
122}
123
124AST_NAMESPACE_END
125
126#endif // _WIN32