Skip to content

Commit 2cb0548

Browse files
committed
Refactored.
1 parent 3fa9272 commit 2cb0548

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

llvm/lib/Support/Windows/Path.inc

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
// These two headers must be included last, and make sure shlobj is required
2626
// after Windows.h to make sure it picks up our definition of _WIN32_WINNT
2727
#include "llvm/Support/Windows/WindowsSupport.h"
28+
#include <atlbase.h>
2829
#include <shellapi.h>
2930
#include <shlobj.h>
3031

@@ -1387,35 +1388,33 @@ std::error_code remove_directories(const Twine &path, bool IgnoreErrors) {
13871388
Path16.push_back(0);
13881389
Path16.push_back(0);
13891390

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));
14191418
return std::error_code();
14201419
}
14211420

0 commit comments

Comments
 (0)