by
Changes to 8 files · Browse files at 17ebc57da9e1 Showing diff from parent 17d0cd8843d0 8ad6cf24d2fb Diff from another changeset...
@@ -12,6 +12,16 @@ Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; Flags: uninsdeletekey
Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}
+; cmenu handler COM control
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ; ValueData: {app}\THgShell.dll; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}\THgShellx86.dll; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell
+
; overlay handler COM controls
; Normal
Root: HKCR; Subkey: CLSID\{{B456DBA0-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell
@@ -64,10 +74,12 @@Root: HKLM32; Subkey: Software\TortoiseOverlays\Unversioned; Check: Is64BitInstallMode; ValueType: string; ValueName: TortoiseHg; ValueData: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; Components: shell
; Make them approved by administrator
+Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
+Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
@@ -75,32 +87,32 @@
; Context menu handlers
Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
|
|
@@ -0,0 +1,45 @@ + #ifndef _CShellExtCMenu_h_
+#define _CShellExtCMenu_h_
+
+#include <vector>
+#include <string>
+
+
+class CShellExtCMenu: public IContextMenu3, IShellExtInit
+{
+ ULONG m_cRef;
+
+ LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH]
+ std::vector<std::string> myFiles;
+ std::string myFolder;
+
+ void DoHgtk(const std::string&);
+
+public:
+ explicit CShellExtCMenu(char dummy);
+ ~CShellExtCMenu();
+
+ // IUnknown
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // IContextMenu3
+ STDMETHODIMP QueryContextMenu(
+ HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast,
+ UINT uFlags);
+ STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
+ STDMETHODIMP GetCommandString(
+ UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName,
+ UINT cchMax);
+ STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ STDMETHODIMP HandleMenuMsg2(
+ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+
+ // IShellExtInit
+ STDMETHODIMP Initialize(
+ LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID);
+};
+
+
+#endif
|
|
@@ -0,0 +1,27 @@ + #ifndef _CShellExtOverlay_h_
+#define _CShellExtOverlay_h_
+
+
+class CShellExtOverlay: public IShellIconOverlayIdentifier
+{
+ ULONG m_cRef;
+ const char myTortoiseClass;
+
+public:
+ explicit CShellExtOverlay(char Class);
+ ~CShellExtOverlay();
+
+ // IUnknown
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // IShellIconOverlayIdentifier
+ STDMETHODIMP GetOverlayInfo(
+ LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags);
+ STDMETHODIMP GetPriority(int* pPriority);
+ STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
+};
+
+
+#endif
|
|
|
@@ -1,11 +1,14 @@ #include "stdafx.h"
-#include "ShellExt.h"
#include "TortoiseUtils.h"
#include "StringUtils.h"
#include "Dirstatecache.h"
#include "Thgstatus.h"
#include "Winstat.h"
#include "InitStatus.h"
+#include "ShellExt.h"
+
+#include "CShellExtCMenu.h"
+
#include <map>
@@ -301,10 +304,10 @@
// IContextMenu
STDMETHODIMP
-CShellExt::QueryContextMenu(
+CShellExtCMenu::QueryContextMenu(
HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
- TDEBUG_TRACE("CShellExt::QueryContextMenu");
+ TDEBUG_TRACE("CShellExtCMenu::QueryContextMenu");
InitMenuMaps();
UINT idCmd = idCmdFirst;
@@ -444,7 +447,7 @@ RemoveMenu(hSubMenu, indexSubMenu - 1, MF_BYPOSITION);
}
- TDEBUG_TRACE(" CShellExt::QueryContextMenu: adding main THG menu");
+ TDEBUG_TRACE(" CShellExtCMenu::QueryContextMenu: adding main THG menu");
InsertSubMenuItemWithIcon2(hMenu, hSubMenu, indexMenu++, idCmd++,
L"TortoiseHG", "hg.ico");
@@ -456,15 +459,15 @@
STDMETHODIMP
-CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
+CShellExtCMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
{
- TDEBUG_TRACE("CShellExt::InvokeCommand");
+ TDEBUG_TRACE("CShellExtCMenu::InvokeCommand");
HRESULT hr = E_INVALIDARG;
if (!HIWORD(lpcmi->lpVerb))
{
UINT idCmd = LOWORD(lpcmi->lpVerb);
- TDEBUG_TRACE("CShellExt::InvokeCommand: idCmd = " << idCmd);
+ TDEBUG_TRACE("CShellExtCMenu::InvokeCommand: idCmd = " << idCmd);
MenuIdCmdMap::iterator iter = MenuIdMap.find(idCmd);
if (iter != MenuIdMap.end())
{
@@ -474,7 +477,7 @@ else
{
TDEBUG_TRACE(
- "CShellExt::InvokeCommand: action not found for idCmd "
+ "CShellExtCMenu::InvokeCommand: action not found for idCmd "
<< idCmd
);
}
@@ -484,7 +487,7 @@
STDMETHODIMP
-CShellExt::GetCommandString(
+CShellExtCMenu::GetCommandString(
UINT_PTR idCmd, UINT uFlags, UINT FAR *reserved,
LPSTR pszName, UINT cchMax)
{
@@ -513,7 +516,7 @@ }
TDEBUG_TRACE(
- "CShellExt::GetCommandString: idCmd = " << idCmd
+ "CShellExtCMenu::GetCommandString: idCmd = " << idCmd
<< ", uFlags = " << uFlags << " (" << sflags << ")"
<< ", cchMax = " << cchMax
);
@@ -521,12 +524,12 @@ MenuIdCmdMap::iterator iter = MenuIdMap.find(static_cast<UINT>(idCmd));
if (iter == MenuIdMap.end())
{
- TDEBUG_TRACE("CShellExt::GetCommandString: idCmd not found");
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: idCmd not found");
}
else
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: name = \"" << iter->second.name << "\"");
+ "CShellExtCMenu::GetCommandString: name = \"" << iter->second.name << "\"");
if (uFlags == GCS_HELPTEXTW)
{
@@ -537,7 +540,7 @@ if (size >= 40)
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: warning:"
+ "CShellExtCMenu::GetCommandString: warning:"
<< " length of help text is " << size
<< ", which is not reasonably short (<40)");
}
@@ -566,7 +569,7 @@
if (cchMax < 1)
{
- TDEBUG_TRACE("CShellExt::GetCommandString: cchMax = "
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: cchMax = "
<< cchMax << " (is <1)");
return res;
}
@@ -583,7 +586,7 @@
size = wcslen(src);
- TDEBUG_TRACEW(L"CShellExt::GetCommandString: res = " << int(res)
+ TDEBUG_TRACEW(L"CShellExtCMenu::GetCommandString: res = " << int(res)
<< L", pszName (wide) = \"" << dest << L"\"");
}
else
@@ -593,14 +596,14 @@
size = strlen(psz);
- TDEBUG_TRACE("CShellExt::GetCommandString: res = " << int(res)
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: res = " << int(res)
<< ", pszName = \"" << psz << "\"");
}
if (size > cchMax-1)
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: string was truncated: size = "
+ "CShellExtCMenu::GetCommandString: string was truncated: size = "
<< size << ", cchMax = " << cchMax);
}
@@ -609,7 +612,7 @@
STDMETHODIMP
-CShellExt::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
+CShellExtCMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT res;
return HandleMenuMsg2(uMsg, wParam, lParam, &res);
@@ -617,7 +620,7 @@
STDMETHODIMP
-CShellExt::HandleMenuMsg2(
+CShellExtCMenu::HandleMenuMsg2(
UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// A great tutorial on owner drawn menus in shell extension can be found
@@ -667,7 +670,7 @@}
-void CShellExt::DoHgtk(const std::string &cmd)
+void CShellExtCMenu::DoHgtk(const std::string &cmd)
{
std::string dir = GetTHgProgRoot();
if (dir.empty())
@@ -748,3 +751,126 @@ LaunchCommand(hgcmd, cwd);
InitStatus::check();
}
+
+
+STDMETHODIMP CShellExtCMenu::Initialize(
+ LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)
+{
+ TCHAR name[MAX_PATH+1];
+
+ TDEBUG_TRACE("CShellExtCMenu::Initialize");
+ TDEBUG_TRACE(" pIDFolder: " << pIDFolder);
+ TDEBUG_TRACE(" pDataObj: " << pDataObj);
+
+ myFolder.clear();
+ myFiles.clear();
+
+ if (pDataObj)
+ {
+ FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+ STGMEDIUM stg = { TYMED_HGLOBAL };
+ if (SUCCEEDED(pDataObj->GetData(&fmt, &stg)) && stg.hGlobal)
+ {
+ HDROP hDrop = (HDROP) GlobalLock(stg.hGlobal);
+
+ if (hDrop)
+ {
+ UINT uNumFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
+ TDEBUG_TRACE(" hDrop uNumFiles = " << uNumFiles);
+ for (UINT i = 0; i < uNumFiles; ++i) {
+ if (DragQueryFile(hDrop, i, name, MAX_PATH) > 0)
+ {
+ TDEBUG_TRACE(" DragQueryFile [" << i << "] = " << name);
+ myFiles.push_back(name);
+ }
+ }
+ }
+ else
+ {
+ TDEBUG_TRACE(" hDrop is NULL ");
+ }
+
+ GlobalUnlock(stg.hGlobal);
+ if (stg.pUnkForRelease)
+ {
+ IUnknown* relInterface = (IUnknown*) stg.pUnkForRelease;
+ relInterface->Release();
+ }
+ }
+ else
+ {
+ TDEBUG_TRACE(" pDataObj->GetData failed");
+ }
+ }
+
+ // if a directory background
+ if (pIDFolder)
+ {
+ SHGetPathFromIDList(pIDFolder, name);
+ TDEBUG_TRACE(" Folder " << name);
+ myFolder = name;
+ }
+
+ return NOERROR;
+}
+
+
+CShellExtCMenu::CShellExtCMenu(char dummy) :
+ m_ppszFileUserClickedOn(0)
+{
+ m_cRef = 0L;
+ CShellExt::IncDllRef();
+}
+
+
+CShellExtCMenu::~CShellExtCMenu()
+{
+ CShellExt::DecDllRef();
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtCMenu::AddRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtCMenu::Release()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if(--m_cRef)
+ return m_cRef;
+ delete this;
+ return 0L;
+}
+
+
+STDMETHODIMP CShellExtCMenu::QueryInterface(REFIID riid, LPVOID FAR* ppv)
+{
+ *ppv = NULL;
+ if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown))
+ {
+ *ppv = (LPSHELLEXTINIT) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu))
+ {
+ *ppv = (LPCONTEXTMENU) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu2))
+ {
+ *ppv = (IContextMenu2*) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu3))
+ {
+ *ppv = (IContextMenu3*) this;
+ }
+
+ if (*ppv)
+ {
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+}
|
@@ -3,14 +3,15 @@ #include "TortoiseUtils.h"
#include "StringUtils.h"
#include "QueryDirstate.h"
+#include "CShellExtOverlay.h"
#include <shlwapi.h>
-STDMETHODIMP CShellExt::GetOverlayInfo(
+STDMETHODIMP CShellExtOverlay::GetOverlayInfo(
LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags)
{
- TDEBUG_TRACE("CShellExt::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass);
+ TDEBUG_TRACE("CShellExtOverlay::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass);
// icons are determined by TortoiseOverlays shim
*pIndex = 0;
*pdwFlags = 0;
@@ -19,16 +20,16 @@}
-STDMETHODIMP CShellExt::GetPriority(int *pPriority)
+STDMETHODIMP CShellExtOverlay::GetPriority(int *pPriority)
{
*pPriority = 1;
return S_OK;
}
-STDMETHODIMP CShellExt::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */)
+STDMETHODIMP CShellExtOverlay::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */)
{
- ThgCriticalSection cs(GetCriticalSection());
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
std::string cval;
if (GetRegistryConfig("EnableOverlays", cval) != 0 && cval == "0")
@@ -53,3 +54,53 @@
return S_FALSE;
}
+
+
+CShellExtOverlay::CShellExtOverlay(char tortoiseClass) :
+ myTortoiseClass(tortoiseClass)
+{
+ m_cRef = 0L;
+ CShellExt::IncDllRef();
+}
+
+
+CShellExtOverlay::~CShellExtOverlay()
+{
+ CShellExt::DecDllRef();
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtOverlay::AddRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtOverlay::Release()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if(--m_cRef)
+ return m_cRef;
+ delete this;
+ return 0L;
+}
+
+
+STDMETHODIMP CShellExtOverlay::QueryInterface(REFIID riid, LPVOID FAR* ppv)
+{
+ *ppv = NULL;
+ if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier)
+ || IsEqualIID(riid, IID_IUnknown) )
+ {
+ *ppv = (IShellIconOverlayIdentifier*) this;
+ }
+
+ if (*ppv)
+ {
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+}
|
|
@@ -3,11 +3,17 @@ #include "TortoiseUtils.h"
#include "StringUtils.h"
#include "InitStatus.h"
+#include "ThgClassFactory.h"
+#include "CShellExtCMenu.h"
+#include "CShellExtOverlay.h"
+
#include <olectl.h>
#define INITGUID
#include <initguid.h>
+DEFINE_GUID(CLSID_TortoiseHgCmenu, 0xb456db9fL, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
+
DEFINE_GUID(CLSID_TortoiseHg0, 0xb456dba0L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
DEFINE_GUID(CLSID_TortoiseHg1, 0xb456dba1L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
DEFINE_GUID(CLSID_TortoiseHg2, 0xb456dba2L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
@@ -19,8 +25,6 @@UINT g_cRefThisDll = 0;
HINSTANCE g_hmodThisDll = NULL;
-HMENU hSubMenu = 0;
-
CRITICAL_SECTION g_critical_section;
@@ -75,34 +79,39 @@ TDEBUG_TRACE("DllGetClassObject clsid = " << WideToMultibyte(pwszShellExt));
*ppvOut = NULL;
- if (IsEqualIID(rclsid, CLSID_TortoiseHg0))
+ typedef ThgClassFactory<CShellExtOverlay> FactOvl;
+ typedef ThgClassFactory<CShellExtCMenu> FactCmenu;
+
+ if (IsEqualIID(rclsid, CLSID_TortoiseHgCmenu))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('C'); // clean
+ FactCmenu *pcf = new FactCmenu(0);
+ TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHgCmenu");
+ return pcf->QueryInterface(riid, ppvOut);
+ }
+ else if (IsEqualIID(rclsid, CLSID_TortoiseHg0))
+ {
+ FactOvl *pcf = new FactOvl('C'); // clean
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg0");
++InitStatus::inst().unchanged_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg1))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('A'); // added
+ FactOvl *pcf = new FactOvl('A'); // added
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg1");
++InitStatus::inst().added_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg2))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('M'); // modified
+ FactOvl *pcf = new FactOvl('M'); // modified
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg2");
++InitStatus::inst().modified_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg6))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('?'); // not in repo
+ FactOvl *pcf = new FactOvl('?'); // not in repo
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg6");
++InitStatus::inst().notinrepo_;
return pcf->QueryInterface(riid, ppvOut);
@@ -119,110 +128,6 @@
VOID _UnloadResources(VOID)
{
- if (hSubMenu)
- DestroyMenu(hSubMenu);
-}
-
-
-LPCRITICAL_SECTION CDllRegSxClassFactory::GetCriticalSection()
-{
- return &g_critical_section;
-}
-
-
-CDllRegSxClassFactory::CDllRegSxClassFactory(char classToMake) :
- myclassToMake(classToMake)
-{
- ThgCriticalSection cs(GetCriticalSection());
- m_cRef = 0L;
- g_cRefThisDll++;
-}
-
-
-CDllRegSxClassFactory::~CDllRegSxClassFactory()
-{
- ThgCriticalSection cs(GetCriticalSection());
- g_cRefThisDll--;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::QueryInterface(
- REFIID riid, LPVOID FAR* ppv)
-{
- *ppv = NULL;
-
- if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
- {
- *ppv = (LPCLASSFACTORY) this;
- AddRef();
- return NOERROR;
- }
-
- return E_NOINTERFACE;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::AddRef()
-{
- ThgCriticalSection cs(GetCriticalSection());
- return ++m_cRef;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::Release()
-{
- ThgCriticalSection cs(GetCriticalSection());
- if (--m_cRef)
- return m_cRef;
-
- delete this;
- return 0L;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::CreateInstance(
- LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
-{
- *ppvObj = NULL;
-
- if (pUnkOuter)
- return CLASS_E_NOAGGREGATION;
-
- LPCSHELLEXT pShellExt = new CShellExt(myclassToMake);
- if (NULL == pShellExt)
- return E_OUTOFMEMORY;
-
- return pShellExt->QueryInterface(riid, ppvObj);
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::LockServer(BOOL fLock)
-{
- return NOERROR;
-}
-
-
-CShellExt::CShellExt(char tortoiseClass) :
- myTortoiseClass(tortoiseClass),
- m_ppszFileUserClickedOn(0)
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- m_cRef = 0L;
- m_pDataObj = NULL;
-
- g_cRefThisDll++;
-}
-
-
-CShellExt::~CShellExt()
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- if (m_pDataObj)
- m_pDataObj->Release();
-
- g_cRefThisDll--;
}
@@ -232,116 +137,15 @@}
-STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR* ppv)
-{
- *ppv = NULL;
- if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown))
- {
- *ppv = (LPSHELLEXTINIT) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu))
- {
- *ppv = (LPCONTEXTMENU) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu2))
- {
- *ppv = (IContextMenu2*) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu3))
- {
- *ppv = (IContextMenu3*) this;
- }
- else if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier))
- {
- *ppv = (IShellIconOverlayIdentifier*) this;
- }
-
- if (*ppv)
- {
- AddRef();
- return NOERROR;
- }
-
- return E_NOINTERFACE;
+void CShellExt::IncDllRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ g_cRefThisDll++;
}
-STDMETHODIMP_(ULONG) CShellExt::AddRef()
+void CShellExt::DecDllRef()
{
- ThgCriticalSection cs(GetCriticalSection());
- return ++m_cRef;
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ g_cRefThisDll--;
}
-
-
-STDMETHODIMP_(ULONG) CShellExt::Release()
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- if(--m_cRef)
- return m_cRef;
-
- delete this;
- return 0L;
-}
-
-
-STDMETHODIMP CShellExt::Initialize(
- LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)
-{
- TCHAR name[MAX_PATH+1];
-
- TDEBUG_TRACE("CShellExt::Initialize");
- TDEBUG_TRACE(" pIDFolder: " << pIDFolder);
- TDEBUG_TRACE(" pDataObj: " << pDataObj);
-
- myFolder.clear();
- myFiles.clear();
-
- if (pDataObj)
- {
- FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
- STGMEDIUM stg = { TYMED_HGLOBAL };
- if (SUCCEEDED(pDataObj->GetData(&fmt, &stg)) && stg.hGlobal)
- {
- HDROP hDrop = (HDROP) GlobalLock(stg.hGlobal);
-
- if (hDrop)
- {
- UINT uNumFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
- TDEBUG_TRACE(" hDrop uNumFiles = " << uNumFiles);
- for (UINT i = 0; i < uNumFiles; ++i) {
- if (DragQueryFile(hDrop, i, name, MAX_PATH) > 0)
- {
- TDEBUG_TRACE(" DragQueryFile [" << i << "] = " << name);
- myFiles.push_back(name);
- }
- }
- }
- else
- {
- TDEBUG_TRACE(" hDrop is NULL ");
- }
-
- GlobalUnlock(stg.hGlobal);
- if (stg.pUnkForRelease)
- {
- IUnknown* relInterface = (IUnknown*) stg.pUnkForRelease;
- relInterface->Release();
- }
- }
- else
- {
- TDEBUG_TRACE(" pDataObj->GetData failed");
- }
- }
-
- // if a directory background
- if (pIDFolder)
- {
- SHGetPathFromIDList(pIDFolder, name);
- TDEBUG_TRACE(" Folder " << name);
- myFolder = name;
- }
-
- return NOERROR;
-}
|
@@ -1,84 +1,15 @@ #ifndef _SHELL_EXT_H_
#define _SHELL_EXT_H_
-#include <vector>
-#include <string>
-
-class CDllRegSxClassFactory: public IClassFactory
+class CShellExt
{
- protected:
- ULONG m_cRef;
- const char myclassToMake;
-
- public:
- explicit CDllRegSxClassFactory(char classToMake);
- ~CDllRegSxClassFactory();
-
- static LPCRITICAL_SECTION GetCriticalSection();
-
- STDMETHODIMP QueryInterface(REFIID, LPVOID FAR*);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
-
- STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR*);
- STDMETHODIMP LockServer(BOOL);
+public:
+ static LPCRITICAL_SECTION GetCriticalSection();
+ static void IncDllRef();
+ static void DecDllRef();
};
-typedef CDllRegSxClassFactory* LPCSHELLEXTCLASSFACTORY;
-
-
-class CShellExt:
- public IContextMenu3, IShellIconOverlayIdentifier, IShellExtInit
-{
- const char myTortoiseClass;
-
- protected:
- ULONG m_cRef;
- LPDATAOBJECT m_pDataObj;
-
- LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH]
- std::vector<std::string> myFiles;
- std::string myFolder;
-
- void CShellExt::DoHgtk(const std::string&);
-
- public:
- static LPCRITICAL_SECTION GetCriticalSection();
-
- explicit CShellExt(char Class);
- ~CShellExt();
-
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
-
- // IContextMenu3
- STDMETHODIMP QueryContextMenu(
- HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast,
- UINT uFlags);
- STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
- STDMETHODIMP GetCommandString(
- UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName,
- UINT cchMax);
- STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
- STDMETHODIMP HandleMenuMsg2(
- UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
-
- // IShellIconOverlayIdentifier
- STDMETHODIMP GetOverlayInfo(
- LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags);
- STDMETHODIMP GetPriority(int* pPriority);
- STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
-
- // IShellExtInit
- STDMETHODIMP Initialize(
- LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID);
- };
-
-typedef CShellExt* LPCSHELLEXT;
-
class ThgCriticalSection
{
|
|
@@ -0,0 +1,86 @@ + #ifndef _ThgClassFactory_h_
+#define _ThgClassFactory_h_
+
+#include "ShellExt.h"
+
+
+template <class T>
+class ThgClassFactory: public IClassFactory
+{
+ ULONG m_cRef;
+ const char myclassToMake;
+
+public:
+ explicit ThgClassFactory(char classToMake) :
+ myclassToMake(classToMake)
+ {
+ CShellExt::IncDllRef();
+ m_cRef = 0L;
+ }
+
+
+ ~ThgClassFactory()
+ {
+ CShellExt::DecDllRef();
+ }
+
+
+ STDMETHODIMP QueryInterface(
+ REFIID riid, LPVOID FAR* ppv)
+ {
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+ {
+ *ppv = (LPCLASSFACTORY) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+ }
+
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+ }
+
+
+ STDMETHODIMP_(ULONG) Release()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if (--m_cRef)
+ return m_cRef;
+
+ delete this;
+ return 0L;
+ }
+
+
+ STDMETHODIMP CreateInstance(
+ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
+ {
+ *ppvObj = NULL;
+
+ if (pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ T *pShellExt = new T(myclassToMake);
+ if (NULL == pShellExt)
+ return E_OUTOFMEMORY;
+
+ return pShellExt->QueryInterface(riid, ppvObj);
+ }
+
+
+ STDMETHODIMP LockServer(BOOL fLock)
+ {
+ return NOERROR;
+ }
+
+};
+
+
+#endif
|
Loading...