[ACPPAGE] Enable version lies until Win7 + some cleanup
[reactos.git] / dll / shellext / acppage / ACPPage.cpp
1 /*
2 * PROJECT: ReactOS Compatibility Layer Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: acppage entrypoint
5 * COPYRIGHT: Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8 #include "precomp.h"
9
10 #include <shellutils.h>
11
12 HMODULE g_hModule = NULL;
13 LONG g_ModuleRefCnt = 0;
14
15 class CLayerUIPropPageModule : public CComModule
16 {
17 public:
18 };
19
20 BEGIN_OBJECT_MAP(ObjectMap)
21 OBJECT_ENTRY(CLSID_CLayerUIPropPage, CLayerUIPropPage)
22 END_OBJECT_MAP()
23
24 CLayerUIPropPageModule gModule;
25
26 EXTERN_C
27 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
28 {
29 switch (dwReason)
30 {
31 case DLL_PROCESS_ATTACH:
32 DisableThreadLibraryCalls(hInstance);
33 g_hModule = hInstance;
34 gModule.Init(ObjectMap, hInstance, NULL);
35 break;
36 case DLL_PROCESS_DETACH:
37 gModule.Term();
38 break;
39 }
40
41 return(TRUE);
42 }
43
44 STDAPI DllCanUnloadNow()
45 {
46 if (g_ModuleRefCnt)
47 return S_FALSE;
48 return gModule.DllCanUnloadNow();
49 }
50
51 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
52 {
53 return gModule.DllGetClassObject(rclsid, riid, ppv);
54 }
55
56 STDAPI DllRegisterServer()
57 {
58 HRESULT hr;
59
60 hr = gModule.DllRegisterServer(FALSE);
61 if (FAILED(hr))
62 return hr;
63
64 return S_OK;
65 }
66
67 STDAPI DllUnregisterServer()
68 {
69 HRESULT hr;
70
71 hr = gModule.DllUnregisterServer(FALSE);
72 if (FAILED(hr))
73 return hr;
74
75 return S_OK;
76 }
77
78 struct CCoInit
79 {
80 CCoInit() { hres = CoInitialize(NULL); }
81 ~CCoInit() { if (SUCCEEDED(hres)) { CoUninitialize(); } }
82 HRESULT hres;
83 };
84
85 EXTERN_C
86 inline ULONG
87 Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
88 {
89 char Buffer[512];
90 char* Current = Buffer;
91 size_t Length = _countof(Buffer);
92 const char* fname = strrchr(filename, '\\');
93 if (fname == NULL)
94 {
95 fname = strrchr(filename, '/');
96 if (fname != NULL)
97 fname++;
98 }
99 else
100 fname++;
101
102 if (fname == NULL)
103 fname = filename;
104
105 StringCchPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, "%s:%d: ", fname, line);
106 va_list ArgList;
107 va_start(ArgList, lpFormat);
108 StringCchVPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, lpFormat, ArgList);
109 va_end(ArgList);
110 OutputDebugStringA(Buffer);
111 return 0;
112 }
113
114
115 EXTERN_C
116 BOOL WINAPI GetExeFromLnk(PCWSTR pszLnk, PWSTR pszExe, size_t cchSize)
117 {
118 CCoInit init;
119 if (FAILED_UNEXPECTEDLY(init.hres))
120 return FALSE;
121
122 CComPtr<IShellLinkW> spShellLink;
123 if (FAILED_UNEXPECTEDLY(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellLinkW, &spShellLink))))
124 return FALSE;
125
126 CComPtr<IPersistFile> spPersistFile;
127 if (FAILED_UNEXPECTEDLY(spShellLink->QueryInterface(IID_PPV_ARG(IPersistFile, &spPersistFile))))
128 return FALSE;
129
130 if (FAILED_UNEXPECTEDLY(spPersistFile->Load(pszLnk, STGM_READ)) || FAILED_UNEXPECTEDLY(spShellLink->Resolve(NULL, SLR_NO_UI | SLR_NOUPDATE | SLR_NOSEARCH)))
131 return FALSE;
132
133 return !FAILED_UNEXPECTEDLY(spShellLink->GetPath(pszExe, cchSize, NULL, SLGP_RAWPATH));
134 }