Author: rharabien
Date: Tue Dec 27 15:25:32 2011
New Revision: 54769
URL:
http://svn.reactos.org/svn/reactos?rev=54769&view=rev
Log:
[SHELL32]
- Fix memory leak in Open With menu
- Show icons in Open With menu
- General code improvements
Modified:
trunk/reactos/dll/win32/shell32/openwithmenu.cpp
trunk/reactos/dll/win32/shell32/openwithmenu.h
Modified: trunk/reactos/dll/win32/shell32/openwithmenu.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/openwith…
==============================================================================
--- trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] Tue Dec 27 15:25:32
2011
@@ -37,13 +37,12 @@
{
BOOL bMenu;
HMENU hMenu;
- HWND hDlgCtrl;
- UINT Count;
- BOOL NoOpen;
- UINT idCmdFirst;
+ HWND hDlgCtrl;
+ BOOL bNoOpen;
+ UINT idCmd;
} OPEN_WITH_CONTEXT, *POPEN_WITH_CONTEXT;
-#define MANUFACTURER_NAME_SIZE 100
+#define MANUFACTURER_NAME_SIZE 100
typedef struct
{
@@ -52,7 +51,6 @@
WCHAR szManufacturer[MANUFACTURER_NAME_SIZE];
} OPEN_ITEM_CONTEXT, *POPEN_ITEM_CONTEXT;
-
typedef struct _LANGANDCODEPAGE_
{
WORD lang;
@@ -61,26 +59,83 @@
static HANDLE OpenMRUList(HKEY hKey);
-static VOID LoadItemFromHKCU(POPEN_WITH_CONTEXT pContext, const WCHAR * szExt);
-static VOID LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, const WCHAR * szExt);
-static VOID InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName);
+static VOID LoadItemFromHKCU(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszExt);
+static VOID LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszExt);
+static VOID InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszAppName);
+static VOID FreeMenuItemContext(HMENU hMenu);
COpenWithMenu::COpenWithMenu()
{
- count = 0;
- wId = 0;
+ m_idCmdFirst = 0;
+ m_idCmdLast = 0;
}
COpenWithMenu::~COpenWithMenu()
{
- TRACE(" destroying IContextMenu(%p)\n", this);
-}
-
-static VOID
-AddChooseProgramItem(HMENU hMenu, UINT idCmdFirst)
-{
+ TRACE("Destroying IContextMenu(%p)\n", this);
+ if (m_hSubMenu)
+ FreeMenuItemContext(m_hSubMenu);
+}
+
+static VOID
+FreeMenuItemContext(HMENU hMenu)
+{
+ INT Count, Index;
MENUITEMINFOW mii;
- WCHAR szBuffer[MAX_PATH];
+
+ /* get item count */
+ Count = GetMenuItemCount(hMenu);
+ if (Count == -1)
+ return;
+
+ /* setup menuitem info */
+ ZeroMemory(&mii, sizeof(mii));
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_DATA | MIIM_FTYPE | MIIM_CHECKMARKS;
+
+ for(Index = 0; Index < Count; Index++)
+ {
+ if (GetMenuItemInfoW(hMenu, Index, TRUE, &mii))
+ {
+ if (mii.dwItemData)
+ HeapFree(GetProcessHeap(), 0, (LPVOID)mii.dwItemData);
+ if (mii.hbmpChecked)
+ DeleteObject(mii.hbmpChecked);
+ }
+ }
+}
+
+static HBITMAP
+IconToBitmap(HICON hIcon)
+{
+ HDC hdc, hdcScr;
+ HBITMAP hbm, hbmOld;
+ RECT rc;
+
+ hdcScr = GetDC(NULL);
+ hdc = CreateCompatibleDC(hdcScr);
+ SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXMENUCHECK),
GetSystemMetrics(SM_CYMENUCHECK));
+ hbm = CreateCompatibleBitmap(hdcScr, rc.right, rc.bottom);
+ ReleaseDC(NULL, hdcScr);
+
+ hbmOld = (HBITMAP)SelectObject(hdc, hbm);
+ FillRect(hdc, &rc, (HBRUSH)(COLOR_MENU + 1));
+ if(!DrawIconEx(hdc, 0, 0, hIcon, rc.right, rc.bottom, 0, NULL, DI_NORMAL))
+ ERR("DrawIcon failed: %x\n", GetLastError());
+ SelectObject(hdc, hbmOld);
+
+ DeleteDC(hdc);
+
+ return hbm;
+}
+
+static VOID
+AddChooseProgramItem(HMENU hMenu, UINT idCmd)
+{
+ MENUITEMINFOW mii;
+ WCHAR wszBuf[128];
+
+ TRACE("hMenu %p idCmd %u\n", hMenu, idCmd);
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
@@ -89,15 +144,18 @@
mii.wID = -1;
InsertMenuItemW(hMenu, -1, TRUE, &mii);
- if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH_CHOOSE, szBuffer, sizeof(szBuffer)
/ sizeof(WCHAR)))
- wcscpy(szBuffer, L"Choose Program...");
-
- mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_STRING;
+ if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH_CHOOSE, wszBuf, sizeof(wszBuf) /
sizeof(WCHAR)))
+ {
+ ERR("Failed to load string\n");
+ return;
+ }
+
+ mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
mii.fType = MFT_STRING;
mii.fState = MFS_ENABLED;
- mii.wID = idCmdFirst;
- mii.dwTypeData = (LPWSTR)szBuffer;
- mii.cch = wcslen(szBuffer);
+ mii.wID = idCmd;
+ mii.dwTypeData = (LPWSTR)wszBuf;
+ mii.cch = wcslen(wszBuf);
InsertMenuItemW(hMenu, -1, TRUE, &mii);
}
@@ -105,51 +163,47 @@
static VOID
LoadOpenWithItems(POPEN_WITH_CONTEXT pContext, LPCWSTR szName)
{
- const WCHAR * szExt;
- WCHAR szPath[100];
- DWORD dwPath;
-
- szExt = wcsrchr(szName, '.');
- if (!szExt)
- {
- /* FIXME
- * show default list of available programs
- */
+ const WCHAR *pwszExt;
+ WCHAR wszPath[100];
+ DWORD dwSize;
+
+ pwszExt = wcsrchr(szName, '.');
+ if (!pwszExt)
+ {
+ /* FIXME: show default list of available programs */
return;
}
/* load programs directly associated from HKCU */
- LoadItemFromHKCU(pContext, szExt);
+ LoadItemFromHKCU(pContext, pwszExt);
/* load programs associated from HKCR\Extension */
- LoadItemFromHKCR(pContext, szExt);
+ LoadItemFromHKCR(pContext, pwszExt);
/* load programs referenced from HKCR\ProgId */
- dwPath = sizeof(szPath);
- szPath[0] = 0;
- if (RegGetValueW(HKEY_CLASSES_ROOT, szExt, NULL, RRF_RT_REG_SZ, NULL, szPath,
&dwPath) == ERROR_SUCCESS)
- {
- szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
- LoadItemFromHKCR(pContext, szPath);
- }
+ dwSize = sizeof(wszPath);
+ if (RegGetValueW(HKEY_CLASSES_ROOT, pwszExt, NULL, RRF_RT_REG_SZ, NULL, wszPath,
&dwSize) == ERROR_SUCCESS)
+ LoadItemFromHKCR(pContext, wszPath);
}
HRESULT WINAPI COpenWithMenu::QueryContextMenu(
- HMENU hmenu,
+ HMENU hMenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
MENUITEMINFOW mii;
- WCHAR szBuffer[100] = {0};
- INT pos;
- HMENU hSubMenu = NULL;
+ WCHAR wszBuf[100];
+ INT DefaultPos;
+ HMENU hSubMenu;
OPEN_WITH_CONTEXT Context;
- if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer) /
sizeof(WCHAR)))
- {
- ERR("failed to load string\n");
+ TRACE("hMenu %p indexMenu %u idFirst %u idLast %u uFlags %u\n", hMenu,
indexMenu, idCmdFirst, idCmdLast, uFlags);
+
+ if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, wszBuf, sizeof(wszBuf) /
sizeof(WCHAR)))
+ {
+ ERR("Failed to load string\n");
return E_FAIL;
}
@@ -158,50 +212,52 @@
/* set up context */
ZeroMemory(&Context, sizeof(OPEN_WITH_CONTEXT));
Context.bMenu = TRUE;
- Context.Count = 0;
Context.hMenu = hSubMenu;
- Context.idCmdFirst = idCmdFirst;
+ Context.idCmd = idCmdFirst;
+
/* load items */
- LoadOpenWithItems(&Context, szPath);
- if (!Context.Count)
- {
+ LoadOpenWithItems(&Context, m_wszPath);
+ if (Context.idCmd == idCmdFirst)
+ {
+ /* No items has been added */
DestroyMenu(hSubMenu);
- hSubMenu = NULL;
- wId = 0;
- count = 0;
+ m_hSubMenu = NULL;
+ m_idCmdFirst = idCmdFirst;
+ m_idCmdLast = idCmdFirst;
}
else
{
- AddChooseProgramItem(hSubMenu, Context.idCmdFirst++);
- count = Context.idCmdFirst - idCmdFirst;
- /* verb start at index zero */
- wId = count - 1;
- hSubMenu = hSubMenu;
- }
-
- pos = GetMenuDefaultItem(hmenu, TRUE, 0) + 1;
+ AddChooseProgramItem(hSubMenu, Context.idCmd);
+ m_idCmdFirst = idCmdFirst;
+ m_idCmdLast = Context.idCmd;
+ m_hSubMenu = hSubMenu;
+ }
+
+ DefaultPos = GetMenuDefaultItem(hMenu, TRUE, 0);
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
- if (hSubMenu)
+ if (m_hSubMenu)
{
mii.fMask |= MIIM_SUBMENU;
- mii.hSubMenu = hSubMenu;
- }
- mii.dwTypeData = (LPWSTR) szBuffer;
+ mii.hSubMenu = m_hSubMenu;
+ mii.wID = -1;
+ }
+ else
+ mii.wID = m_idCmdLast;
+
+ mii.fType = MFT_STRING;
+ mii.dwTypeData = (LPWSTR)wszBuf;
+ mii.cch = wcslen(wszBuf);
+
mii.fState = MFS_ENABLED;
- if (!pos)
- {
+ if (DefaultPos == -1)
mii.fState |= MFS_DEFAULT;
- }
-
- mii.wID = Context.idCmdFirst;
- mii.fType = MFT_STRING;
- if (InsertMenuItemW(hmenu, pos, TRUE, &mii))
- Context.Count++;
-
- return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Context.Count);
+
+ InsertMenuItemW(hMenu, DefaultPos + 1, TRUE, &mii);
+
+ return MAKE_HRESULT(SEVERITY_SUCCESS, 0, m_idCmdLast - idCmdFirst + 1);
}
static VOID
@@ -229,22 +285,21 @@
}
static BOOL
-HideApplicationFromList(WCHAR *pFileName)
-{
- WCHAR szBuffer[100] = L"Applications\\";
+IsAppHidden(LPCWSTR pwszFileName)
+{
+ WCHAR wszBuf[100];
DWORD dwSize = 0;
LONG result;
- if (wcslen(pFileName) > (sizeof(szBuffer) / sizeof(WCHAR)) - 14)
+ if (FAILED(StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Applications\\%s",
pwszFileName)))
{
ERR("insufficient buffer\n");
return FALSE;
}
- wcscpy(&szBuffer[13], pFileName);
-
- result = RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, L"NoOpenWith",
RRF_RT_REG_SZ, NULL, NULL, &dwSize);
-
- TRACE("result %d szBuffer %s\n", result, debugstr_w(szBuffer));
+
+ result = RegGetValueW(HKEY_CLASSES_ROOT, wszBuf, L"NoOpenWith",
RRF_RT_REG_SZ, NULL, NULL, &dwSize);
+
+ TRACE("result %d wszBuf %s\n", result, wszBuf);
if (result == ERROR_SUCCESS)
return TRUE;
@@ -253,101 +308,95 @@
}
static VOID
-WriteStaticShellExtensionKey(HKEY hRootKey, const WCHAR * pVerb, WCHAR *pFullPath)
+WriteStaticShellExtensionKey(HKEY hRootKey, LPCWSTR pwszVerb, LPCWSTR pwszFullPath)
{
HKEY hShell;
- LONG result;
- WCHAR szBuffer[MAX_PATH+10] = L"shell\\";
-
- if (wcslen(pVerb) > (sizeof(szBuffer) / sizeof(WCHAR)) - 15 ||
- wcslen(pFullPath) > (sizeof(szBuffer) / sizeof(WCHAR)) - 4)
+ WCHAR wszBuf[MAX_PATH];
+
+ /* construct verb reg path */
+ if (FAILED(StringCbPrintfW(wszBuf, sizeof(wszBuf), L"shell\\%s\\command",
pwszVerb)))
{
ERR("insufficient buffer\n");
return;
}
- /* construct verb reg path */
- wcscpy(&szBuffer[6], pVerb);
- wcscat(szBuffer, L"\\command");
-
/* create verb reg key */
- if (RegCreateKeyExW(hRootKey, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hShell,
NULL) != ERROR_SUCCESS)
+ if (RegCreateKeyExW(hRootKey, wszBuf, 0, NULL, 0, KEY_WRITE, NULL, &hShell, NULL)
!= ERROR_SUCCESS)
return;
/* build command buffer */
- wcscpy(szBuffer, pFullPath);
- wcscat(szBuffer, L" %1");
-
- result = RegSetValueExW(hShell, NULL, 0, REG_SZ, (const BYTE*)szBuffer,
(wcslen(szBuffer) + 1) * sizeof(WCHAR));
+ StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s %%1", pwszFullPath);
+
+ RegSetValueExW(hShell, NULL, 0, REG_SZ, (const BYTE*)wszBuf, (wcslen(wszBuf) + 1) *
sizeof(WCHAR));
RegCloseKey(hShell);
}
static VOID
-StoreNewSettings(LPCWSTR szFileName, WCHAR *szAppName)
-{
- WCHAR szBuffer[100] = {
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\"};
- const WCHAR * pFileExt;
+StoreNewSettings(LPCWSTR pwszFileName, LPCWSTR pwszAppName)
+{
+ WCHAR wszBuf[100];
+ LPCWSTR pwszExt;
HKEY hKey;
- LONG result;
HANDLE hList;
- /* get file extension */
- pFileExt = wcsrchr(szFileName, L'.');
- if (wcslen(pFileExt) > (sizeof(szBuffer) / sizeof(WCHAR)) - 60)
+ /* Get file extension */
+ pwszExt = wcsrchr(pwszFileName, L'.');
+ if (!pwszExt)
+ return;
+
+ /* Build registry key */
+ if (FAILED(StringCbPrintfW(wszBuf, sizeof(wszBuf),
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\%s",
+ pwszExt)))
{
ERR("insufficient buffer\n");
return;
}
- wcscpy(&szBuffer[60], pFileExt);
- /* open base key for this file extension */
- if (RegCreateKeyExW(HKEY_CURRENT_USER, szBuffer, 0, NULL, 0, KEY_WRITE | KEY_READ,
NULL, &hKey, NULL) != ERROR_SUCCESS)
- return;
-
- /* open mru list */
+
+ /* Open base key for this file extension */
+ if (RegCreateKeyExW(HKEY_CURRENT_USER, wszBuf, 0, NULL, 0, KEY_WRITE | KEY_READ,
NULL, &hKey, NULL) != ERROR_SUCCESS)
+ return;
+
+ /* Open MRU list */
hList = OpenMRUList(hKey);
-
- if (!hList)
- {
- RegCloseKey(hKey);
- return;
- }
-
- /* insert the entry */
- result = AddMRUStringW(hList, szAppName);
-
- /* close mru list */
- FreeMRUList(hList);
- /* create mru list key */
+ if (hList)
+ {
+ /* Insert the entry */
+ AddMRUStringW(hList, pwszAppName);
+
+ /* Close MRU list */
+ FreeMRUList(hList);
+ }
+
RegCloseKey(hKey);
}
static VOID
-SetProgrammAsDefaultHandler(LPCWSTR szFileName, WCHAR * szAppName)
+SetProgramAsDefaultHandler(LPCWSTR pwszFileName, LPCWSTR pwszAppName)
{
HKEY hKey;
HKEY hAppKey;
DWORD dwDisposition;
- WCHAR szBuffer[100];
+ WCHAR wszBuf[100];
DWORD dwSize;
BOOL result;
- const WCHAR * pFileExt;
- WCHAR * pFileName;
-
- /* extract file extension */
- pFileExt = wcsrchr(szFileName, L'.');
- if (!pFileExt)
- return;
-
- /* create file extension key */
- if (RegCreateKeyExW(HKEY_CLASSES_ROOT, pFileExt, 0, NULL, 0, KEY_WRITE, NULL,
&hKey, &dwDisposition) != ERROR_SUCCESS)
- return;
-
- if (dwDisposition & REG_CREATED_NEW_KEY)
- {
- /* a new entry was created create the prog key id */
- wcscpy(szBuffer, &pFileExt[1]);
- wcscat(szBuffer, L"_auto_file");
- if (RegSetValueExW(hKey, NULL, 0, REG_SZ, (const BYTE*)szBuffer,
(wcslen(szBuffer) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
+ LPCWSTR pwszExt;
+ LPCWSTR pwszAppFileName;
+
+ /* Extract file extension */
+ pwszExt = wcsrchr(pwszFileName, L'.');
+ if (!pwszExt)
+ return;
+
+ /* Create file extension key */
+ if (RegCreateKeyExW(HKEY_CLASSES_ROOT, pwszExt, 0, NULL, 0, KEY_WRITE, NULL,
&hKey, &dwDisposition) != ERROR_SUCCESS)
+ return;
+
+ if (dwDisposition == REG_CREATED_NEW_KEY)
+ {
+ /* A new entry was created create the prog key id */
+ StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s_auto_file", pwszExt + 1);
+ if (RegSetValueExW(hKey, NULL, 0, REG_SZ, (const BYTE*)wszBuf, (wcslen(wszBuf) +
1) * sizeof(WCHAR)) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return;
@@ -355,38 +404,36 @@
}
else
{
- /* entry already exists fetch prog key id */
- dwSize = sizeof(szBuffer);
- if (RegGetValueW(hKey, NULL, NULL, RRF_RT_REG_SZ, NULL, szBuffer, &dwSize) !=
ERROR_SUCCESS)
+ /* Entry already exists fetch prog key id */
+ dwSize = sizeof(wszBuf);
+ if (RegGetValueW(hKey, NULL, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize) !=
ERROR_SUCCESS)
{
RegCloseKey(hKey);
return;
}
}
- /* close file extension key */
+
+ /* Close file extension key */
RegCloseKey(hKey);
- /* create prog id key */
- if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szBuffer, 0, NULL, 0, KEY_WRITE, NULL,
&hKey, &dwDisposition) != ERROR_SUCCESS)
- return;
-
-
- /* check if there already verbs existing for that app */
- pFileName = wcsrchr(szAppName, L'\\');
- wcscpy(szBuffer, L"Classes\\Applications\\");
- wcscat(szBuffer, pFileName);
- wcscat(szBuffer, L"\\shell");
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szBuffer, 0, KEY_READ, &hAppKey) ==
ERROR_SUCCESS)
- {
- /* copy static verbs from Classes\Applications key */
- HKEY hTemp;
- if (RegCreateKeyExW(hKey, L"shell", 0, NULL, 0, KEY_READ | KEY_WRITE,
NULL, &hTemp, &dwDisposition) == ERROR_SUCCESS)
- {
- result = RegCopyTreeW(hAppKey, NULL, hTemp);
- RegCloseKey(hTemp);
+ /* Create prog id key */
+ if (RegCreateKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, NULL, 0, KEY_WRITE, NULL,
&hKey, &dwDisposition) != ERROR_SUCCESS)
+ return;
+
+ /* Check if there already verbs existing for that app */
+ pwszAppFileName = wcsrchr(pwszAppName, L'\\');
+ StringCbPrintfW(wszBuf, sizeof(wszBuf),
L"Classes\\Applications\\%s\\shell", pwszAppFileName);
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, KEY_READ, &hAppKey) ==
ERROR_SUCCESS)
+ {
+ /* Copy static verbs from Classes\Applications key */
+ HKEY hDestKey;
+ if (RegCreateKeyExW(hKey, L"shell", 0, NULL, 0, KEY_WRITE, NULL,
&hDestKey, &dwDisposition) == ERROR_SUCCESS)
+ {
+ result = RegCopyTreeW(hAppKey, NULL, hDestKey);
+ RegCloseKey(hDestKey);
if (result == ERROR_SUCCESS)
{
- /* copied all subkeys, we are done */
+ /* Copied all subkeys, we are done */
RegCloseKey(hKey);
RegCloseKey(hAppKey);
return;
@@ -394,55 +441,54 @@
}
RegCloseKey(hAppKey);
}
- /* write standard static shell extension */
- WriteStaticShellExtensionKey(hKey, L"open", szAppName);
+
+ /* Write standard static shell extension */
+ WriteStaticShellExtensionKey(hKey, L"open", pwszAppName);
RegCloseKey(hKey);
}
static VOID
BrowseForApplication(HWND hwndDlg)
{
- WCHAR szBuffer[64] = {0};
- WCHAR szFilter[256] = {0};
- WCHAR szPath[MAX_PATH];
+ WCHAR wszTitle[64];
+ WCHAR wszFilter[256];
+ WCHAR wszPath[MAX_PATH];
OPENFILENAMEW ofn;
OPEN_WITH_CONTEXT Context;
- INT count;
-
- /* load resource open with */
- if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer) /
sizeof(WCHAR)))
- {
- szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
- ofn.lpstrTitle = szBuffer;
- ofn.nMaxFileTitle = wcslen(szBuffer);
- }
-
+ INT iCount;
+
+ /* Initialize OPENFILENAMEW structure */
ZeroMemory(&ofn, sizeof(OPENFILENAMEW));
ofn.lStructSize = sizeof(OPENFILENAMEW);
ofn.hInstance = shell32_hInstance;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
- ofn.nMaxFile = (sizeof(szPath) / sizeof(WCHAR));
- ofn.lpstrFile = szPath;
-
- /* load the filter resource string */
- if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH_FILTER, szFilter, sizeof(szFilter) /
sizeof(WCHAR)))
- {
- szFilter[(sizeof(szFilter)/sizeof(WCHAR))-1] = 0;
- ofn.lpstrFilter = szFilter;
- }
- ZeroMemory(szPath, sizeof(szPath));
-
- /* call openfilename */
+ ofn.nMaxFile = (sizeof(wszPath) / sizeof(WCHAR));
+ ofn.lpstrFile = wszPath;
+
+ /* Init title */
+ if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, wszTitle, sizeof(wszTitle) /
sizeof(WCHAR)))
+ {
+ ofn.lpstrTitle = wszTitle;
+ ofn.nMaxFileTitle = wcslen(wszTitle);
+ }
+
+ /* Init the filter string */
+ if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH_FILTER, wszFilter, sizeof(wszFilter)
/ sizeof(WCHAR)))
+ ofn.lpstrFilter = wszFilter;
+ ZeroMemory(wszPath, sizeof(wszPath));
+
+ /* Create OpenFile dialog */
if (!GetOpenFileNameW(&ofn))
return;
- /* setup context for insert proc */
+ /* Setup context for insert proc */
ZeroMemory(&Context, sizeof(OPEN_WITH_CONTEXT));
Context.hDlgCtrl = GetDlgItem(hwndDlg, 14002);
- count = SendMessage(Context.hDlgCtrl, LB_GETCOUNT, 0, 0);
- InsertOpenWithItem(&Context, szPath);
- /* select new item */
- SendMessage(Context.hDlgCtrl, LB_SETCURSEL, count, 0);
+ iCount = SendMessage(Context.hDlgCtrl, LB_GETCOUNT, 0, 0);
+ InsertOpenWithItem(&Context, wszPath);
+
+ /* Select new item */
+ SendMessage(Context.hDlgCtrl, LB_SETCURSEL, iCount, 0);
}
static POPEN_ITEM_CONTEXT
@@ -464,48 +510,39 @@
}
static VOID
-ExecuteOpenItem(POPEN_ITEM_CONTEXT pItemContext, LPCWSTR FileName)
+ExecuteOpenItem(POPEN_ITEM_CONTEXT pItemContext, LPCWSTR pwszPath)
{
STARTUPINFOW si;
PROCESS_INFORMATION pi;
- WCHAR szPath[(MAX_PATH * 2)];
+ WCHAR wszBuf[MAX_PATH * 2 + 8];
/* setup path with argument */
ZeroMemory(&si, sizeof(STARTUPINFOW));
si.cb = sizeof(STARTUPINFOW);
- wcscpy(szPath, pItemContext->szAppName);
- wcscat(szPath, L" ");
- wcscat(szPath, FileName);
-
- ERR("path %s\n", debugstr_w(szPath));
-
- if (CreateProcessW(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si,
&pi))
+
+ /* Build the command line. Don't use applcation name as first parameter of
+ CreateProcessW, because it have to be an absolute path. */
+ StringCbPrintfW(wszBuf, sizeof(wszBuf), L"\"%s\"
\"%s\"", pItemContext->szAppName, pwszPath);
+
+ /* Start the application now */
+ TRACE("AppName %ls Path %ls\n", pItemContext->szAppName, pwszPath);
+ if (CreateProcessW(NULL, wszBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si,
&pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
- SHAddToRecentDocs(SHARD_PATHW, FileName);
+ SHAddToRecentDocs(SHARD_PATHW, pwszPath);
}
}
static INT_PTR CALLBACK
OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- LPMEASUREITEMSTRUCT lpmis;
- LPDRAWITEMSTRUCT lpdis;
- INT index;
- WCHAR szBuffer[MAX_PATH + 30] = { 0 };
- OPENASINFO *poainfo;
- TEXTMETRIC mt;
- COLORREF preColor, preBkColor;
- POPEN_ITEM_CONTEXT pItemContext;
- LONG YOffset;
- OPEN_WITH_CONTEXT Context;
-
- poainfo = (OPENASINFO*) GetWindowLongPtr(hwndDlg, DWLP_USER);
-
switch(uMsg)
{
case WM_INITDIALOG:
+ {
+ OPENASINFO *poainfo;
+
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)lParam);
poainfo = (OPENASINFO*)lParam;
if (!(poainfo->oaifInFlags & OAIF_ALLOW_REGISTRATION))
@@ -516,23 +553,28 @@
ShowWindow(GetDlgItem(hwndDlg, 14003), SW_HIDE);
if (poainfo->pcszFile)
{
- szBuffer[0] = L'\0';
- GetDlgItemTextW(hwndDlg, 14001, szBuffer, sizeof(szBuffer) /
sizeof(szBuffer[0]));
- index = wcslen(szBuffer);
- if (index + wcslen(poainfo->pcszFile) + 1 < sizeof(szBuffer) /
sizeof(szBuffer[0]))
- wcscat(szBuffer, poainfo->pcszFile);
- szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
- SetDlgItemTextW(hwndDlg, 14001, szBuffer);
+ WCHAR wszBuf[MAX_PATH];
+ UINT cchBuf;
+ OPEN_WITH_CONTEXT Context;
+
+ cchBuf = GetDlgItemTextW(hwndDlg, 14001, wszBuf, sizeof(wszBuf) /
sizeof(wszBuf[0]));
+ StringCchCopyW(wszBuf, _countof(wszBuf) - cchBuf, poainfo->pcszFile);
+ SetDlgItemTextW(hwndDlg, 14001, wszBuf);
+
ZeroMemory(&Context, sizeof(OPEN_WITH_CONTEXT));
Context.hDlgCtrl = GetDlgItem(hwndDlg, 14002);
LoadOpenWithItems(&Context, poainfo->pcszFile);
+
SendMessage(Context.hDlgCtrl, LB_SETCURSEL, 0, 0);
}
return TRUE;
+ }
case WM_MEASUREITEM:
- lpmis = (LPMEASUREITEMSTRUCT) lParam;
+ {
+ LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight = 64;
return TRUE;
+ }
case WM_COMMAND:
switch(LOWORD(wParam))
{
@@ -544,16 +586,21 @@
InvalidateRect((HWND)lParam, NULL, TRUE); // FIXME USE UPDATE
RECT
break;
case 14005: /* ok */
+ {
+ POPEN_ITEM_CONTEXT pItemContext;
+
pItemContext = GetCurrentOpenItemContext(hwndDlg);
if (pItemContext)
{
+ OPENASINFO *poainfo = (OPENASINFO*)GetWindowLongPtr(hwndDlg,
DWLP_USER);
+
/* store settings in HKCU path */
StoreNewSettings(poainfo->pcszFile,
pItemContext->szAppName);
if (SendDlgItemMessage(hwndDlg, 14003, BM_GETCHECK, 0, 0) ==
BST_CHECKED)
{
/* set programm as default handler */
- SetProgrammAsDefaultHandler(poainfo->pcszFile,
pItemContext->szAppName);
+ SetProgramAsDefaultHandler(poainfo->pcszFile,
pItemContext->szAppName);
}
if (poainfo->oaifInFlags & OAIF_EXEC)
@@ -562,6 +609,7 @@
FreeListItems(hwndDlg);
DestroyWindow(hwndDlg);
return TRUE;
+ }
case 14006: /* cancel */
FreeListItems(hwndDlg);
DestroyWindow(hwndDlg);
@@ -571,7 +619,15 @@
}
break;
case WM_DRAWITEM:
- lpdis = (LPDRAWITEMSTRUCT) lParam;
+ {
+ LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
+ TEXTMETRIC mt;
+ COLORREF preColor, preBkColor;
+ LONG cyOffset;
+ POPEN_ITEM_CONTEXT pItemContext;
+ INT Index;
+ WCHAR wszBuf[MAX_PATH];
+
if ((int)lpdis->itemID == -1)
break;
@@ -579,10 +635,10 @@
{
case ODA_SELECT:
case ODA_DRAWENTIRE:
- index = SendMessageW(lpdis->hwndItem, LB_GETCURSEL, 0, 0);
+ Index = SendMessageW(lpdis->hwndItem, LB_GETCURSEL, 0, 0);
pItemContext = (POPEN_ITEM_CONTEXT)SendMessage(lpdis->hwndItem,
LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0);
- if ((int)lpdis->itemID == index)
+ if ((int)lpdis->itemID == Index)
{
/* paint focused item with standard background colour */
HBRUSH hBrush;
@@ -601,26 +657,27 @@
preBkColor = SetBkColor(lpdis->hDC, RGB(255, 255, 255));
}
- SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
(LPARAM) szBuffer);
+ SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
(LPARAM)wszBuf);
/* paint the icon */
DrawIconEx(lpdis->hDC, lpdis->rcItem.left,
lpdis->rcItem.top, pItemContext->hIcon, 0, 0, 0, NULL, DI_NORMAL);
/* get text size */
GetTextMetrics(lpdis->hDC, &mt);
/* paint app name */
- YOffset = lpdis->rcItem.top + mt.tmHeight / 2;
- TextOutW(lpdis->hDC, 45, YOffset, szBuffer, wcslen(szBuffer));
+ cyOffset = lpdis->rcItem.top + mt.tmHeight / 2;
+ TextOutW(lpdis->hDC, 45, cyOffset, wszBuf, wcslen(wszBuf));
/* paint manufacturer description */
- YOffset += mt.tmHeight + 2;
+ cyOffset += mt.tmHeight + 2;
preColor = SetTextColor(lpdis->hDC, RGB(192, 192, 192));
if (pItemContext->szManufacturer[0])
- TextOutW(lpdis->hDC, 45, YOffset,
pItemContext->szManufacturer, wcslen(pItemContext->szManufacturer));
+ TextOutW(lpdis->hDC, 45, cyOffset,
pItemContext->szManufacturer, wcslen(pItemContext->szManufacturer));
else
- TextOutW(lpdis->hDC, 45, YOffset, pItemContext->szAppName,
wcslen(pItemContext->szAppName));
+ TextOutW(lpdis->hDC, 45, cyOffset, pItemContext->szAppName,
wcslen(pItemContext->szAppName));
SetTextColor(lpdis->hDC, preColor);
SetBkColor(lpdis->hDC, preBkColor);
break;
}
break;
+ }
case WM_CLOSE:
FreeListItems(hwndDlg);
DestroyWindow(hwndDlg);
@@ -631,72 +688,43 @@
return FALSE;
}
-static VOID
-FreeMenuItemContext(HMENU hMenu)
-{
- INT Count;
- INT Index;
- MENUITEMINFOW mii;
-
- /* get item count */
- Count = GetMenuItemCount(hMenu);
- if (Count == -1)
- return;
-
- /* setup menuitem info */
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_DATA | MIIM_FTYPE;
-
- for(Index = 0; Index < Count; Index++)
- {
- if (GetMenuItemInfoW(hMenu, Index, TRUE, &mii))
- {
- if ((mii.fType & MFT_SEPARATOR) || mii.dwItemData == 0)
- continue;
- HeapFree(GetProcessHeap(), 0, (LPVOID)mii.dwItemData);
- }
- }
-}
-
HRESULT WINAPI
COpenWithMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
{
- MENUITEMINFOW mii;
-
- ERR("This %p wId %x count %u verb %x\n", this, wId, count,
LOWORD(lpici->lpVerb));
-
- if (HIWORD(lpici->lpVerb) != 0 || LOWORD(lpici->lpVerb) > wId)
- return E_FAIL;
-
- if (wId == LOWORD(lpici->lpVerb))
- {
- OPENASINFO info;
-
- info.pcszFile = szPath;
- info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT | OAIF_EXEC;
- info.pcszClass = NULL;
- FreeMenuItemContext(hSubMenu);
- return SHOpenWithDialog(lpici->hwnd, &info);
- }
-
- /* retrieve menu item info */
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_DATA | MIIM_FTYPE;
-
- if (GetMenuItemInfoW(hSubMenu, LOWORD(lpici->lpVerb), TRUE, &mii))
- {
- POPEN_ITEM_CONTEXT pItemContext = (POPEN_ITEM_CONTEXT)mii.dwItemData;
- if (pItemContext)
- {
- /* launch item with specified app */
- ExecuteOpenItem(pItemContext, szPath);
- }
- }
- /* free menu item context */
- FreeMenuItemContext(hSubMenu);
- return S_OK;
+ HRESULT hr = E_FAIL;
+
+ TRACE("This %p idFirst %u idLast %u idCmd %u\n", this, m_idCmdFirst,
m_idCmdLast, m_idCmdFirst + LOWORD(lpici->lpVerb));
+
+ if (HIWORD(lpici->lpVerb) == 0 && m_idCmdFirst + LOWORD(lpici->lpVerb)
<= m_idCmdLast)
+ {
+ if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdLast)
+ {
+ OPENASINFO info;
+
+ info.pcszFile = m_wszPath;
+ info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT | OAIF_EXEC;
+ info.pcszClass = NULL;
+ hr = SHOpenWithDialog(lpici->hwnd, &info);
+ }
+ else
+ {
+ /* retrieve menu item info */
+ MENUITEMINFOW mii;
+ ZeroMemory(&mii, sizeof(mii));
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_DATA | MIIM_FTYPE;
+
+ if (GetMenuItemInfoW(m_hSubMenu, LOWORD(lpici->lpVerb), TRUE, &mii)
&& mii.dwItemData)
+ {
+ /* launch item with specified app */
+ POPEN_ITEM_CONTEXT pItemContext = (POPEN_ITEM_CONTEXT)mii.dwItemData;
+ ExecuteOpenItem(pItemContext, m_wszPath);
+ hr = S_OK;
+ }
+ }
+ }
+
+ return hr;
}
HRESULT WINAPI
@@ -720,117 +748,107 @@
}
VOID
-GetManufacturer(WCHAR * szAppName, POPEN_ITEM_CONTEXT pContext)
-{
- UINT VerSize;
- DWORD DummyHandle;
+GetManufacturer(LPCWSTR pwszAppName, POPEN_ITEM_CONTEXT pContext)
+{
+ UINT cbSize;
LPVOID pBuf;
- WORD lang = 0;
- WORD code = 0;
- LPLANGANDCODEPAGE lplangcode;
- WCHAR szBuffer[100];
- WCHAR * pResult;
- BOOL bResult;
-
- static const WCHAR wFormat[] = L"\\StringFileInfo\\%04x%04x\\CompanyName";
- static const WCHAR wTranslation[] = L"VarFileInfo\\Translation";
+ WORD wLang = 0, wCode = 0;
+ LPLANGANDCODEPAGE lpLangCode;
+ WCHAR wszBuf[100];
+ WCHAR *pResult;
+
+ /* Clear manufacturer */
+ pContext->szManufacturer[0] = 0;
/* query version info size */
- VerSize = GetFileVersionInfoSizeW(szAppName, &DummyHandle);
- if (!VerSize)
- {
- pContext->szManufacturer[0] = 0;
- return;
- }
+ cbSize = GetFileVersionInfoSizeW(pwszAppName, NULL);
+ if (!cbSize)
+ return;
/* allocate buffer */
- pBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, VerSize);
+ pBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbSize);
if (!pBuf)
- {
- pContext->szManufacturer[0] = 0;
- return;
- }
+ return;
/* query version info */
- if(!GetFileVersionInfoW(szAppName, 0, VerSize, pBuf))
- {
- pContext->szManufacturer[0] = 0;
+ if(!GetFileVersionInfoW(pwszAppName, 0, cbSize, pBuf))
+ {
HeapFree(GetProcessHeap(), 0, pBuf);
return;
}
/* query lang code */
- if(VerQueryValueW(pBuf, const_cast<LPWSTR>(wTranslation), (LPVOID
*)&lplangcode, &VerSize))
- {
- /* FIXME find language from current locale / if not available,
+ if(VerQueryValueW(pBuf, L"VarFileInfo\\Translation",
(LPVOID*)&lpLangCode, &cbSize))
+ {
+ /* FIXME: find language from current locale / if not available,
* default to english
* for now default to first available language
*/
- lang = lplangcode->lang;
- code = lplangcode->code;
- }
- /* set up format */
- swprintf(szBuffer, wFormat, lang, code);
- /* query manufacturer */
- pResult = NULL;
- bResult = VerQueryValueW(pBuf, szBuffer, (LPVOID *)&pResult, &VerSize);
-
- if (VerSize && bResult && pResult)
- wcscpy(pContext->szManufacturer, pResult);
- else
- pContext->szManufacturer[0] = 0;
+ wLang = lpLangCode->lang;
+ wCode = lpLangCode->code;
+ }
+
+ /* Query manufacturer */
+ swprintf(wszBuf, L"\\StringFileInfo\\%04x%04x\\CompanyName", wLang,
wCode);
+
+ if (VerQueryValueW(pBuf, wszBuf, (LPVOID *)&pResult, &cbSize))
+ StringCbCopyNW(pContext->szManufacturer, sizeof(pContext->szManufacturer),
pResult, cbSize);
HeapFree(GetProcessHeap(), 0, pBuf);
}
static VOID
-InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
-{
- MENUITEMINFOW mii;
+InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszAppName)
+{
POPEN_ITEM_CONTEXT pItemContext;
- LRESULT index;
WCHAR *pwszExt;
- WCHAR Buffer[_MAX_FNAME];
+ WCHAR wszFileName[_MAX_FNAME];
pItemContext = (OPEN_ITEM_CONTEXT *)HeapAlloc(GetProcessHeap(), 0,
sizeof(OPEN_ITEM_CONTEXT));
if (!pItemContext)
return;
- /* store app path */
- wcscpy(pItemContext->szAppName, szAppName);
- /* extract path name */
- _wsplitpath(szAppName, NULL, NULL, Buffer, NULL);
- pwszExt = wcsrchr(Buffer, '.');
+ /* Store app path and icon */
+ wcscpy(pItemContext->szAppName, pwszAppName);
+ pItemContext->hIcon = ExtractIconW(shell32_hInstance, pwszAppName, 0);
+ pItemContext->szManufacturer[0] = 0;
+
+ /* Extract path name */
+ _wsplitpath(pwszAppName, NULL, NULL, wszFileName, NULL);
+
+ /* Build application name from filename. FIXME: do it properly */
+ pwszExt = wcsrchr(wszFileName, '.');
if (pwszExt)
pwszExt[0] = L'\0';
- Buffer[0] = towupper(Buffer[0]);
-
+ wszFileName[0] = towupper(wszFileName[0]);
+
+ /* Add item to the list */
if (pContext->bMenu)
{
+ MENUITEMINFOW mii;
+
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
+ mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA | MIIM_CHECKMARKS;
mii.fType = MFT_STRING; //MFT_OWNERDRAW;
mii.fState = MFS_ENABLED;
- mii.wID = pContext->idCmdFirst;
- mii.dwTypeData = Buffer;
- mii.cch = wcslen(Buffer);
+ mii.wID = pContext->idCmd;
+ mii.dwTypeData = wszFileName;
+ mii.cch = wcslen(wszFileName);
mii.dwItemData = (ULONG_PTR)pItemContext;
- wcscpy(pItemContext->szManufacturer, Buffer);
+ mii.hbmpChecked = mii.hbmpUnchecked = IconToBitmap(pItemContext->hIcon);
+
if (InsertMenuItemW(pContext->hMenu, -1, TRUE, &mii))
- {
- pContext->idCmdFirst++;
- pContext->Count++;
- }
+ pContext->idCmd++;
}
else
{
- /* get default icon */
- pItemContext->hIcon = ExtractIconW(shell32_hInstance, szAppName, 0);
+ LRESULT Index;
+
/* get manufacturer */
- GetManufacturer(pItemContext->szAppName, pItemContext);
- index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)Buffer);
- if (index != LB_ERR)
- SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, index,
(LPARAM)pItemContext);
+ GetManufacturer(pwszAppName, pItemContext);
+ Index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0,
(LPARAM)wszFileName);
+ if (Index != LB_ERR)
+ SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, Index,
(LPARAM)pItemContext);
}
}
@@ -843,18 +861,18 @@
static HANDLE
OpenMRUList(HKEY hKey)
{
- CREATEMRULISTW info;
+ CREATEMRULISTW Info;
/* initialize mru list info */
- info.cbSize = sizeof(info);
- info.nMaxItems = 32;
- info.dwFlags = MRU_STRING;
- info.hKey = hKey;
- info.lpszSubKey = L"OpenWithList";
- info.lpfnCompare = NULL;
+ Info.cbSize = sizeof(Info);
+ Info.nMaxItems = 32;
+ Info.dwFlags = MRU_STRING;
+ Info.hKey = hKey;
+ Info.lpszSubKey = L"OpenWithList";
+ Info.lpfnCompare = NULL;
/* load list */
- return CreateMRUListW(&info);
+ return CreateMRUListW(&Info);
}
static VOID
@@ -862,7 +880,7 @@
{
HANDLE hList;
int nItem, nCount, nResult;
- WCHAR szBuffer[MAX_PATH];
+ WCHAR wszBuf[MAX_PATH];
/* open mru list */
hList = OpenMRUList(hKey);
@@ -877,14 +895,13 @@
for(nItem = 0; nItem < nCount; nItem++)
{
- nResult = EnumMRUListW(hList, nItem, szBuffer, MAX_PATH);
+ nResult = EnumMRUListW(hList, nItem, wszBuf, _countof(wszBuf));
if (nResult <= 0)
continue;
- /* make sure its zero terminated */
- szBuffer[min(MAX_PATH-1, nResult)] = '\0';
+
/* insert item */
- if (!HideApplicationFromList(szBuffer))
- InsertOpenWithItem(pContext, szBuffer);
+ if (!IsAppHidden(wszBuf))
+ InsertOpenWithItem(pContext, wszBuf);
}
/* free the mru list */
@@ -892,83 +909,70 @@
}
static VOID
-LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, const WCHAR * szExt)
+LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszExt)
{
HKEY hKey;
HKEY hSubKey;
- WCHAR szBuffer[MAX_PATH+10];
- WCHAR szResult[100];
+ WCHAR wszBuf[MAX_PATH], wszBuf2[MAX_PATH];
DWORD dwSize;
- static const WCHAR szOpenWithList[] = L"OpenWithList";
- static const WCHAR szOpenWithProgIds[] = L"OpenWithProgIDs";
- static const WCHAR szPerceivedType[] = L"PerceivedType";
- static const WCHAR szSysFileAssoc[] = L"SystemFileAssociations\\%s";
-
- /* check if extension exists */
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szExt, 0, KEY_READ | KEY_WRITE, &hKey) !=
ERROR_SUCCESS)
+ /* Check if extension exists */
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, pwszExt, 0, KEY_READ, &hKey) !=
ERROR_SUCCESS)
return;
if (RegGetValueW(hKey, NULL, L"NoOpen", RRF_RT_REG_SZ, NULL, NULL,
&dwSize) == ERROR_SUCCESS)
{
- /* display warning dialog */
- pContext->NoOpen = TRUE;
- }
-
- /* check if there is a directly available execute key */
- if (RegOpenKeyExW(hKey, L"shell\\open\\command", 0, KEY_READ, &hSubKey)
== ERROR_SUCCESS)
- {
- DWORD dwBuffer = sizeof(szBuffer);
-
- if (RegGetValueW(hSubKey, NULL, NULL, RRF_RT_REG_SZ, NULL, (PVOID)szBuffer,
&dwBuffer) == ERROR_SUCCESS)
- {
- WCHAR * pszSpace = wcsrchr(szBuffer, ' ');
- if (pszSpace)
- {
- /* erase %1 or extra arguments */
- *pszSpace = 0; // FIXME: what about '"'
- }
- if(!HideApplicationFromList(szBuffer))
- InsertOpenWithItem(pContext, szBuffer);
- }
- RegCloseKey(hSubKey);
- }
-
- /* load items from HKCR\Ext\OpenWithList */
- if (RegOpenKeyExW(hKey, szOpenWithList, 0, KEY_READ | KEY_QUERY_VALUE, &hSubKey)
== ERROR_SUCCESS)
+ /* Display warning dialog */
+ pContext->bNoOpen = TRUE;
+ }
+
+ /* Check if there is a directly available execute key */
+ dwSize = sizeof(wszBuf);
+ if (RegGetValueW(hKey, L"shell\\open\\command", NULL, RRF_RT_REG_SZ, NULL,
(PVOID)wszBuf, &dwSize) == ERROR_SUCCESS)
+ {
+ WCHAR *pwszSpace = wcsrchr(wszBuf, L' ');
+ if (pwszSpace)
+ {
+ /* Erase %1 or extra arguments */
+ *pwszSpace = 0; // FIXME: what about '"'
+ }
+ if(!IsAppHidden(wszBuf))
+ InsertOpenWithItem(pContext, wszBuf);
+ }
+
+ /* Load items from HKCR\Ext\OpenWithList */
+ if (RegOpenKeyExW(hKey, L"OpenWithList", 0, KEY_READ, &hSubKey) ==
ERROR_SUCCESS)
{
AddItemFromMRUList(pContext, hKey);
RegCloseKey(hSubKey);
}
- /* load items from HKCR\Ext\OpenWithProgIDs */
- if (RegOpenKeyExW(hKey, szOpenWithProgIds, 0, KEY_READ | KEY_QUERY_VALUE,
&hSubKey) == ERROR_SUCCESS)
+ /* Load items from HKCR\Ext\OpenWithProgIDs */
+ if (RegOpenKeyExW(hKey, L"OpenWithProgIDs", 0, KEY_READ, &hSubKey) ==
ERROR_SUCCESS)
{
AddItemFromProgIDList(pContext, hSubKey);
RegCloseKey(hSubKey);
}
- /* load items from SystemFileAssociations\Ext key */
- swprintf(szResult, szSysFileAssoc, szExt);
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szResult, 0, KEY_READ | KEY_WRITE, &hSubKey)
== ERROR_SUCCESS)
+ /* Load items from SystemFileAssociations\Ext key */
+ StringCbPrintfW(wszBuf, sizeof(wszBuf), L"SystemFileAssociations\\%s",
pwszExt);
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, KEY_READ, &hSubKey) ==
ERROR_SUCCESS)
{
AddItemFromMRUList(pContext, hSubKey);
RegCloseKey(hSubKey);
}
- /* load additional items from referenced PerceivedType*/
- dwSize = sizeof(szBuffer);
- if (RegGetValueW(hKey, NULL, szPerceivedType, RRF_RT_REG_SZ, NULL, szBuffer,
&dwSize) != ERROR_SUCCESS)
+ /* Load additional items from referenced PerceivedType*/
+ dwSize = sizeof(wszBuf);
+ if (RegGetValueW(hKey, NULL, L"PerceivedType", RRF_RT_REG_SZ, NULL, wszBuf,
&dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return;
}
RegCloseKey(hKey);
- /* terminate it explictely */
- szBuffer[29] = 0;
- swprintf(szResult, szSysFileAssoc, szBuffer);
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szResult, 0, KEY_READ | KEY_WRITE, &hSubKey)
== ERROR_SUCCESS)
+ StringCbPrintfW(wszBuf2, sizeof(wszBuf2), L"SystemFileAssociations\\%s",
wszBuf);
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf2, 0, KEY_READ | KEY_WRITE, &hSubKey)
== ERROR_SUCCESS)
{
AddItemFromMRUList(pContext, hSubKey);
RegCloseKey(hSubKey);
@@ -976,25 +980,26 @@
}
static VOID
-LoadItemFromHKCU(POPEN_WITH_CONTEXT pContext, const WCHAR * szExt)
-{
- WCHAR szBuffer[MAX_PATH];
+LoadItemFromHKCU(POPEN_WITH_CONTEXT pContext, LPCWSTR pwszExt)
+{
+ WCHAR wszBuf[MAX_PATH];
HKEY hKey;
- static const WCHAR szOpenWithProgIDs[] =
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\%s\\OpenWithProgIDs";
- static const WCHAR szOpenWithList[] =
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\%s";
-
- /* handle first progid lists */
- swprintf(szBuffer, szOpenWithProgIDs, szExt);
- if (RegOpenKeyExW(HKEY_CURRENT_USER, szBuffer, 0, KEY_READ | KEY_QUERY_VALUE,
&hKey) == ERROR_SUCCESS)
+ /* Handle ProgId lists first */
+ StringCbPrintfW(wszBuf, sizeof(wszBuf),
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\%s\\OpenWithProgIDs",
+ pwszExt);
+ if (RegOpenKeyExW(HKEY_CURRENT_USER, wszBuf, 0, KEY_READ, &hKey) ==
ERROR_SUCCESS)
{
AddItemFromProgIDList(pContext, hKey);
RegCloseKey(hKey);
}
- /* now handle mru lists */
- swprintf(szBuffer, szOpenWithList, szExt);
- if (RegOpenKeyExW(HKEY_CURRENT_USER, szBuffer, 0, KEY_READ | KEY_WRITE, &hKey) ==
ERROR_SUCCESS)
+ /* Now handle MRU lists */
+ StringCbPrintfW(wszBuf, sizeof(wszBuf),
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\%s",
+ pwszExt);
+ if (RegOpenKeyExW(HKEY_CURRENT_USER, wszBuf, 0, KEY_READ, &hKey) ==
ERROR_SUCCESS)
{
AddItemFromMRUList(pContext, hKey);
RegCloseKey(hKey);
@@ -1013,7 +1018,7 @@
LPCITEMIDLIST pidlFolder2;
LPCITEMIDLIST pidlChild;
LPCITEMIDLIST pidl;
- LPWSTR pszExt;
+ LPCWSTR pwszExt;
TRACE("This %p\n", this);
@@ -1059,7 +1064,7 @@
return E_FAIL;
}
- if (!SHGetPathFromIDListW(pidl, szPath))
+ if (!SHGetPathFromIDListW(pidl, m_wszPath))
{
IID *iid = _ILGetGUIDPointer(pidl);
SHFree((void*)pidl);
@@ -1068,15 +1073,14 @@
}
SHFree((void*)pidl);
- TRACE("szPath %s\n", debugstr_w(szPath));
-
- pszExt = wcsrchr(szPath, L'.');
-
- if (pszExt)
- {
- if (!_wcsicmp(pszExt, L".exe") || !_wcsicmp(pszExt,
L".lnk"))
- {
- TRACE("path is a executable or shortcut\n");
+ TRACE("szPath %s\n", debugstr_w(m_wszPath));
+
+ pwszExt = wcsrchr(m_wszPath, L'.');
+ if (pwszExt)
+ {
+ if (!_wcsicmp(pwszExt, L".exe") || !_wcsicmp(pwszExt,
L".lnk"))
+ {
+ TRACE("file is a executable or shortcut\n");
return E_FAIL;
}
}
@@ -1103,7 +1107,7 @@
ShowWindow(hwnd, SW_SHOWNORMAL);
- while (GetMessage(&msg, NULL, 0, 0) != 0 && IsWindow(hwnd))
+ while (GetMessage(&msg, NULL, 0, 0) && IsWindow(hwnd))
{
if (!IsDialogMessage(hwnd, &msg))
{
Modified: trunk/reactos/dll/win32/shell32/openwithmenu.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/openwith…
==============================================================================
--- trunk/reactos/dll/win32/shell32/openwithmenu.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/openwithmenu.h [iso-8859-1] Tue Dec 27 15:25:32 2011
@@ -29,11 +29,9 @@
public IShellExtInit
{
private:
- LONG wId;
- BOOL NoOpen;
- UINT count;
- WCHAR szPath[MAX_PATH];
- HMENU hSubMenu;
+ UINT m_idCmdFirst, m_idCmdLast;
+ WCHAR m_wszPath[MAX_PATH];
+ HMENU m_hSubMenu;
public:
COpenWithMenu();