eecb1ac02ded437e5ed9480cdf2135226a78cbd2
[reactos.git] / dll / shellext / zipfldr / zipfldr.cpp
1 /*
2 * PROJECT: ReactOS Zip Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: zipfldr entrypoint
5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8 #include "precomp.h"
9
10 HMODULE g_hModule = NULL;
11 LONG g_ModuleRefCnt = 0;
12
13 #include <initguid.h>
14
15 DEFINE_GUID(CLSID_ZipFolderStorageHandler, 0xe88dcce0, 0xb7b3, 0x11d1, 0xa9, 0xf0, 0x00, 0xaa, 0x00, 0x60, 0xfa, 0x31);
16 DEFINE_GUID(CLSID_ZipFolderSendTo, 0x888dca60, 0xfc0a, 0x11cf, 0x8f, 0x0f, 0x00, 0xc0, 0x4f, 0xd7, 0xd0, 0x62);
17 DEFINE_GUID(CLSID_ZipFolderContextMenu, 0xb8cdcb65, 0xb1bf, 0x4b42, 0x94, 0x28, 0x1d, 0xfd, 0xb7, 0xee, 0x92, 0xaf);
18 DEFINE_GUID(CLSID_ZipFolderRightDragHandler,0xbd472f60, 0x27fa, 0x11cf, 0xb8, 0xb4, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00);
19 DEFINE_GUID(CLSID_ZipFolderDropHandler, 0xed9d80b9, 0xd157, 0x457b, 0x91, 0x92, 0x0e, 0x72, 0x80, 0x31, 0x3b, 0xf0);
20
21 /* IExplorerCommand: Extract All */
22 DEFINE_GUID(CLSID_ZipFolderExtractAllCommand, 0xc3d9647b, 0x8fd9, 0x4ee6, 0x8b, 0xc7, 0x82, 0x7, 0x80, 0x9, 0x10, 0x5a);
23
24
25 class CZipFldrModule : public CComModule
26 {
27 public:
28 };
29
30
31 BEGIN_OBJECT_MAP(ObjectMap)
32 OBJECT_ENTRY(CLSID_ZipFolderStorageHandler, CZipFolder)
33 OBJECT_ENTRY(CLSID_ZipFolderContextMenu, CZipFolder)
34 OBJECT_ENTRY(CLSID_ZipFolderSendTo, CSendToZip)
35 END_OBJECT_MAP()
36
37 CZipFldrModule gModule;
38
39
40 #include "minizip/ioapi.h"
41 #include "minizip/iowin32.h"
42
43 zlib_filefunc64_def g_FFunc;
44
45 static void init_zlib()
46 {
47 fill_win32_filefunc64W(&g_FFunc);
48 }
49
50 EXTERN_C
51 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
52 {
53 switch (dwReason)
54 {
55 case DLL_PROCESS_ATTACH:
56 DisableThreadLibraryCalls(hInstance);
57 g_hModule = hInstance;
58 gModule.Init(ObjectMap, hInstance, NULL);
59 init_zlib();
60 break;
61 }
62
63 return TRUE;
64 }
65
66 STDAPI DllCanUnloadNow()
67 {
68 if (g_ModuleRefCnt)
69 return S_FALSE;
70 return gModule.DllCanUnloadNow();
71 }
72
73 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
74 {
75 return gModule.DllGetClassObject(rclsid, riid, ppv);
76 }
77
78 STDAPI DllRegisterServer()
79 {
80 HRESULT hr;
81
82 hr = gModule.DllRegisterServer(FALSE);
83 if (FAILED_UNEXPECTEDLY(hr))
84 return hr;
85
86 hr = gModule.UpdateRegistryFromResource(IDR_ZIPFLDR, TRUE, NULL);
87 if (FAILED(hr))
88 return hr;
89
90 return S_OK;
91 }
92
93 STDAPI DllUnregisterServer()
94 {
95 HRESULT hr;
96
97 hr = gModule.DllUnregisterServer(FALSE);
98 if (FAILED_UNEXPECTEDLY(hr))
99 return hr;
100
101 hr = gModule.UpdateRegistryFromResource(IDR_ZIPFLDR, FALSE, NULL);
102 if (FAILED(hr))
103 return hr;
104
105 return S_OK;
106 }
107
108 EXTERN_C
109 BOOL WINAPI
110 RouteTheCall(
111 IN HWND hWndOwner,
112 IN HINSTANCE hInstance,
113 IN LPCSTR lpStringArg,
114 IN INT Show)
115 {
116 CStringW path = lpStringArg;
117 PathRemoveBlanksW(path.GetBuffer());
118 path.ReleaseBuffer();
119 path = L"\"" + path + L"\"";
120 ShellExecuteW(NULL, L"open", L"explorer.exe", path.GetString(), NULL, SW_SHOWNORMAL);
121 return TRUE;
122 }