[SHELL32]

- Improve code readability in defcontextmenu.cpp
- Fix few leaks
- Properly handle reference count when creating objects

svn path=/trunk/; revision=54979
This commit is contained in:
Rafal Harabien 2012-01-15 19:45:02 +00:00
parent 04acd45a57
commit 99b2e3df40
3 changed files with 448 additions and 511 deletions

File diff suppressed because it is too large Load diff

View file

@ -123,11 +123,9 @@ SH_ShowDriveProperties(WCHAR *pwszDrive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST
{ {
HPSXA hpsx = NULL; HPSXA hpsx = NULL;
HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE]; HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE];
WCHAR wszName[256];
PROPSHEETHEADERW psh; PROPSHEETHEADERW psh;
HRESULT hr;
CComObject<CDrvDefExt> *pDrvDefExt = NULL; CComObject<CDrvDefExt> *pDrvDefExt = NULL;
ZeroMemory(&psh, sizeof(PROPSHEETHEADERW)); ZeroMemory(&psh, sizeof(PROPSHEETHEADERW));
psh.dwSize = sizeof(PROPSHEETHEADERW); psh.dwSize = sizeof(PROPSHEETHEADERW);
psh.dwFlags = 0; // FIXME: make it modeless psh.dwFlags = 0; // FIXME: make it modeless
@ -135,6 +133,7 @@ SH_ShowDriveProperties(WCHAR *pwszDrive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST
psh.nStartPage = 0; psh.nStartPage = 0;
psh.phpage = hpsp; psh.phpage = hpsp;
WCHAR wszName[256];
if (GetVolumeInformationW(pwszDrive, wszName, sizeof(wszName) / sizeof(WCHAR), NULL, NULL, NULL, NULL, 0)) if (GetVolumeInformationW(pwszDrive, wszName, sizeof(wszName) / sizeof(WCHAR), NULL, NULL, NULL, NULL, 0))
{ {
psh.pszCaption = wszName; psh.pszCaption = wszName;
@ -148,13 +147,14 @@ SH_ShowDriveProperties(WCHAR *pwszDrive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST
} }
CComPtr<IDataObject> pDataObj; CComPtr<IDataObject> pDataObj;
hr = SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (LPVOID *)&pDataObj); HRESULT hr = SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (LPVOID *)&pDataObj);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
ATLTRY(pDrvDefExt = new CComObject<CDrvDefExt>); hr = CComObject<CDrvDefExt>::CreateInstance(&pDrvDefExt);
if (pDrvDefExt) if (SUCCEEDED(hr))
{ {
pDrvDefExt->AddRef(); // CreateInstance returns object with 0 ref count
hr = pDrvDefExt->Initialize(pidlFolder, pDataObj, NULL); hr = pDrvDefExt->Initialize(pidlFolder, pDataObj, NULL);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {

View file

@ -97,8 +97,6 @@ LoadPropSheetHandlers(LPCWSTR pwszPath, PROPSHEETHEADERW *pHeader, UINT cMaxPage
BOOL BOOL
SH_ShowPropertiesDialog(LPCWSTR pwszPath, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *apidl) SH_ShowPropertiesDialog(LPCWSTR pwszPath, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *apidl)
{ {
HRESULT hr;
HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE];
HPSXA hpsxa[3] = {NULL, NULL, NULL}; HPSXA hpsxa[3] = {NULL, NULL, NULL};
CComObject<CFileDefExt> *pFileDefExt = NULL; CComObject<CFileDefExt> *pFileDefExt = NULL;
@ -107,6 +105,7 @@ SH_ShowPropertiesDialog(LPCWSTR pwszPath, LPCITEMIDLIST pidlFolder, LPCITEMIDLIS
if (pwszPath == NULL || !wcslen(pwszPath)) if (pwszPath == NULL || !wcslen(pwszPath))
return FALSE; return FALSE;
HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE];
memset(hppages, 0x0, sizeof(HPROPSHEETPAGE) * MAX_PROPERTY_SHEET_PAGE); memset(hppages, 0x0, sizeof(HPROPSHEETPAGE) * MAX_PROPERTY_SHEET_PAGE);
/* Make a copy of path */ /* Make a copy of path */
@ -129,13 +128,14 @@ SH_ShowPropertiesDialog(LPCWSTR pwszPath, LPCITEMIDLIST pidlFolder, LPCITEMIDLIS
Header.pszCaption = PathFindFileNameW(wszPath); Header.pszCaption = PathFindFileNameW(wszPath);
CComPtr<IDataObject> pDataObj; CComPtr<IDataObject> pDataObj;
hr = SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (LPVOID *)&pDataObj); HRESULT hr = SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (LPVOID *)&pDataObj);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
ATLTRY(pFileDefExt = new CComObject<CFileDefExt>); hr = CComObject<CFileDefExt>::CreateInstance(&pFileDefExt);
if (pFileDefExt) if (SUCCEEDED(hr))
{ {
pFileDefExt->AddRef(); // CreateInstance returns object with 0 ref count
hr = pFileDefExt->Initialize(pidlFolder, pDataObj, NULL); hr = pFileDefExt->Initialize(pidlFolder, pDataObj, NULL);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {