|
25 | 25 | // These two headers must be included last, and make sure shlobj is required
|
26 | 26 | // after Windows.h to make sure it picks up our definition of _WIN32_WINNT
|
27 | 27 | #include "llvm/Support/Windows/WindowsSupport.h"
|
| 28 | +#include <atlbase.h> |
28 | 29 | #include <shellapi.h>
|
29 | 30 | #include <shlobj.h>
|
30 | 31 |
|
@@ -1387,35 +1388,33 @@ std::error_code remove_directories(const Twine &path, bool IgnoreErrors) {
|
1387 | 1388 | Path16.push_back(0);
|
1388 | 1389 | Path16.push_back(0);
|
1389 | 1390 |
|
1390 |
| - HRESULT HR = |
1391 |
| - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); |
1392 |
| - if (SUCCEEDED(HR)) { |
1393 |
| - IFileOperation *FileOp = NULL; |
1394 |
| - HR = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, |
1395 |
| - IID_PPV_ARGS(&FileOp)); |
1396 |
| - if (SUCCEEDED(HR)) { |
1397 |
| - HR = FileOp->SetOperationFlags(FOF_NO_UI | FOFX_NOCOPYHOOKS); |
1398 |
| - if (SUCCEEDED(HR)) { |
1399 |
| - PIDLIST_ABSOLUTE PIDL = ILCreateFromPathW(Path16.data()); |
1400 |
| - IShellItem *ShItem = NULL; |
1401 |
| - HR = SHCreateItemFromIDList(PIDL, IID_PPV_ARGS(&ShItem)); |
1402 |
| - if (SUCCEEDED(HR)) { |
1403 |
| - HR = FileOp->DeleteItem(ShItem, NULL); |
1404 |
| - if (SUCCEEDED(HR)) { |
1405 |
| - HR = FileOp->PerformOperations(); |
1406 |
| - } |
1407 |
| - ShItem->Release(); |
1408 |
| - } |
1409 |
| - ILFree(PIDL); |
1410 |
| - } |
1411 |
| - FileOp->Release(); |
1412 |
| - } |
1413 |
| - CoUninitialize(); |
1414 |
| - } |
1415 |
| - |
1416 |
| - int result = FAILED(HR) ? HRESULT_CODE(HR) : 0; |
1417 |
| - if (result != 0 && !IgnoreErrors) |
1418 |
| - return mapWindowsError(result); |
| 1391 | + HRESULT HR; |
| 1392 | + do { |
| 1393 | + HR = |
| 1394 | + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); |
| 1395 | + if (FAILED(HR)) |
| 1396 | + break; |
| 1397 | + auto Uninitialize = make_scope_exit([] { CoUninitialize(); }); |
| 1398 | + CComPtr<IFileOperation> FileOp; |
| 1399 | + HR = FileOp.CoCreateInstance(CLSID_FileOperation); |
| 1400 | + if (FAILED(HR)) |
| 1401 | + break; |
| 1402 | + HR = FileOp->SetOperationFlags(FOF_NO_UI | FOFX_NOCOPYHOOKS); |
| 1403 | + if (FAILED(HR)) |
| 1404 | + break; |
| 1405 | + PIDLIST_ABSOLUTE PIDL = ILCreateFromPathW(Path16.data()); |
| 1406 | + auto FreePIDL = make_scope_exit([&PIDL] { ILFree(PIDL); }); |
| 1407 | + CComPtr<IShellItem> ShItem; |
| 1408 | + HR = SHCreateItemFromIDList(PIDL, IID_PPV_ARGS(&ShItem)); |
| 1409 | + if (FAILED(HR)) |
| 1410 | + break; |
| 1411 | + HR = FileOp->DeleteItem(ShItem, NULL); |
| 1412 | + if (FAILED(HR)) |
| 1413 | + break; |
| 1414 | + HR = FileOp->PerformOperations(); |
| 1415 | + } while (false); |
| 1416 | + if (FAILED(HR) && !IgnoreErrors) |
| 1417 | + return mapWindowsError(HRESULT_CODE(HR)); |
1419 | 1418 | return std::error_code();
|
1420 | 1419 | }
|
1421 | 1420 |
|
|
0 commit comments