14#if defined(_WIN32) && !defined(SWIG)
30inline void aShellPumpMessages(
unsigned long waitMs)
32 unsigned long start = GetTickCount();
34 while ((GetTickCount() - start) < waitMs)
37 while (PeekMessageW(&msg,
nullptr, 0, 0, PM_REMOVE))
39 TranslateMessage(&msg);
40 DispatchMessageW(&msg);
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,
55inline std::wstring aShellItemRealName(FolderItem* pItem)
57 if (!pItem)
return std::wstring();
59 BSTR bstrPath =
nullptr;
60 if (SUCCEEDED(pItem->get_Path(&bstrPath)) && bstrPath)
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)
67 if (pos + 1 < path.size())
return path.substr(pos + 1);
69 else if (!path.empty())
76 BSTR bstrName =
nullptr;
77 if (SUCCEEDED(pItem->get_Name(&bstrName)) && bstrName)
79 std::wstring name(bstrName, SysStringLen(bstrName));
80 SysFreeString(bstrName);
83 return std::wstring();
91constexpr long kShellComCopyFlags = FOF_NO_UI;
95constexpr unsigned long kShellComWaitTimeoutMs = 60000;
102inline bool aShellWaitForItem(Folder* pFolder,
const std::wstring& itemName,
unsigned long timeoutMs = kShellComWaitTimeoutMs)
104 unsigned long start = GetTickCount();
106 while ((GetTickCount() - start) < timeoutMs)
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);
114 if (SUCCEEDED(hr) && pCheck !=
nullptr)
119 aShellPumpMessages(100);