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)
10 #include <shellutils.h>
12 HMODULE g_hModule
= NULL
;
13 LONG g_ModuleRefCnt
= 0;
15 class CLayerUIPropPageModule
: public CComModule
20 BEGIN_OBJECT_MAP(ObjectMap
)
21 OBJECT_ENTRY(CLSID_CLayerUIPropPage
, CLayerUIPropPage
)
24 CLayerUIPropPageModule gModule
;
27 BOOL WINAPI
DllMain(HINSTANCE hInstance
, DWORD dwReason
, LPVOID lpReserved
)
31 case DLL_PROCESS_ATTACH
:
32 DisableThreadLibraryCalls(hInstance
);
33 g_hModule
= hInstance
;
34 gModule
.Init(ObjectMap
, hInstance
, NULL
);
36 case DLL_PROCESS_DETACH
:
44 STDAPI
DllCanUnloadNow()
48 return gModule
.DllCanUnloadNow();
51 STDAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
53 return gModule
.DllGetClassObject(rclsid
, riid
, ppv
);
56 STDAPI
DllRegisterServer()
60 hr
= gModule
.DllRegisterServer(FALSE
);
67 STDAPI
DllUnregisterServer()
71 hr
= gModule
.DllUnregisterServer(FALSE
);
80 CCoInit() { hres
= CoInitialize(NULL
); }
81 ~CCoInit() { if (SUCCEEDED(hres
)) { CoUninitialize(); } }
87 Win32DbgPrint(const char *filename
, int line
, const char *lpFormat
, ...)
90 char* Current
= Buffer
;
91 size_t Length
= _countof(Buffer
);
92 const char* fname
= strrchr(filename
, '\\');
95 fname
= strrchr(filename
, '/');
105 StringCchPrintfExA(Current
, Length
, &Current
, &Length
, STRSAFE_NULL_ON_FAILURE
, "%s:%d: ", fname
, line
);
107 va_start(ArgList
, lpFormat
);
108 StringCchVPrintfExA(Current
, Length
, &Current
, &Length
, STRSAFE_NULL_ON_FAILURE
, lpFormat
, ArgList
);
110 OutputDebugStringA(Buffer
);
116 BOOL WINAPI
GetExeFromLnk(PCWSTR pszLnk
, PWSTR pszExe
, size_t cchSize
)
119 if (FAILED_UNEXPECTEDLY(init
.hres
))
122 CComPtr
<IShellLinkW
> spShellLink
;
123 if (FAILED_UNEXPECTEDLY(CoCreateInstance(CLSID_ShellLink
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IShellLinkW
, &spShellLink
))))
126 CComPtr
<IPersistFile
> spPersistFile
;
127 if (FAILED_UNEXPECTEDLY(spShellLink
->QueryInterface(IID_PPV_ARG(IPersistFile
, &spPersistFile
))))
130 if (FAILED_UNEXPECTEDLY(spPersistFile
->Load(pszLnk
, STGM_READ
)) || FAILED_UNEXPECTEDLY(spShellLink
->Resolve(NULL
, SLR_NO_UI
| SLR_NOUPDATE
| SLR_NOSEARCH
)))
133 return !FAILED_UNEXPECTEDLY(spShellLink
->GetPath(pszExe
, cchSize
, NULL
, SLGP_RAWPATH
));