From f8a473300aea68818afcbb5d36200dcab321172d Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Thu, 9 Jan 2025 08:35:30 +0200 Subject: [PATCH] Port WinRT (#1302) IB-8256 Signed-off-by: Raul Metsma --- extensions/windows/CMakeLists.txt | 20 +-- extensions/windows/EsteidShellExtension.idl | 29 ---- extensions/windows/EsteidShellExtension.wxs | 4 +- extensions/windows/EsteidShlExt.cpp | 173 ++++++++------------ extensions/windows/EsteidShlExt.h | 48 +++--- extensions/windows/dllmain.cpp | 60 +++++-- extensions/windows/dllmain.h | 7 - extensions/windows/stdafx.cpp | 5 - extensions/windows/stdafx.h | 27 --- 9 files changed, 141 insertions(+), 232 deletions(-) delete mode 100644 extensions/windows/EsteidShellExtension.idl delete mode 100644 extensions/windows/dllmain.h delete mode 100644 extensions/windows/stdafx.cpp delete mode 100644 extensions/windows/stdafx.h diff --git a/extensions/windows/CMakeLists.txt b/extensions/windows/CMakeLists.txt index 0d1dae52e..7caa9a9bb 100644 --- a/extensions/windows/CMakeLists.txt +++ b/extensions/windows/CMakeLists.txt @@ -2,32 +2,16 @@ cmake_minimum_required(VERSION 3.16) project(EsteidShellExtension VERSION 3.13.9) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) -set(CMAKE_INCLUDE_CURRENT_DIR ON) include(VersionInfo) if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(MIDL_TARGET "x64") set(PLATFORM "x64") else() - set(MIDL_TARGET "win32") set(PLATFORM "x86") endif() -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/EsteidShellExtension_i.h - ${CMAKE_CURRENT_BINARY_DIR}/EsteidShellExtension_i.c - COMMAND Midl.Exe ${CMAKE_CURRENT_SOURCE_DIR}/EsteidShellExtension.idl - /nologo /target NT100 /char signed /env ${MIDL_TARGET} - /tlb EsteidShellExtension.tlb - /h EsteidShellExtension_i.h - /iid EsteidShellExtension_i.c - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - VERBATIM -) - add_library(${PROJECT_NAME} SHARED - ${CMAKE_CURRENT_BINARY_DIR}/EsteidShellExtension_i.c dllmain.cpp EsteidShellExtension.def EsteidShlExt.cpp @@ -35,8 +19,7 @@ add_library(${PROJECT_NAME} SHARED ) set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>" - COMPILE_DEFINITIONS "_UNICODE;UNICODE;_WINDLL" - INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR} + COMPILE_DEFINITIONS "_UNICODE;UNICODE;_WINDLL;WIN32_LEAN_AND_MEAN" INTERPROCEDURAL_OPTIMIZATION YES COMPILE_OPTIONS "/guard:cf" LINK_OPTIONS "/guard:cf" @@ -47,7 +30,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_custom_target(msishellext DEPENDS ${PROJECT_NAME} COMMAND wix.exe build -nologo -arch ${PLATFORM} - -d MSI_VERSION=${VERSION} -d ShellExt=$ ${CMAKE_CURRENT_SOURCE_DIR}/EsteidShellExtension.wxs ${CMAKE_MODULE_PATH}/WelcomeDlg.wxs diff --git a/extensions/windows/EsteidShellExtension.idl b/extensions/windows/EsteidShellExtension.idl deleted file mode 100644 index 90d4b6439..000000000 --- a/extensions/windows/EsteidShellExtension.idl +++ /dev/null @@ -1,29 +0,0 @@ -// EsteidShellExtension.idl : IDL source for EsteidShellExtension -// - -// This file will be processed by the MIDL tool to -// produce the type library (EsteidShellExtension.tlb) and marshalling code. - -import "shobjidl.idl"; - -[ - uuid(F4748FA8-B59E-43FA-9D53-2380EB141AED), - version(1.0), - helpstring("EsteidShellExtension 1.0 Type Library") -] -library EsteidShellExtensionLib -{ - [ -#ifdef _WIN64 - uuid(5606A547-759D-43DA-AEEB-D3BF1D1E816D), -#else - uuid(310AAB39-76FE-401B-8A7F-0F578C5F6AB5), -#endif - helpstring("EsteidShlExt Class") - ] - coclass EsteidShlExt - { - [default] interface IShellExtInit; - interface IContextMenu; - }; -}; diff --git a/extensions/windows/EsteidShellExtension.wxs b/extensions/windows/EsteidShellExtension.wxs index 4a3d80e1c..b56604bd2 100644 --- a/extensions/windows/EsteidShellExtension.wxs +++ b/extensions/windows/EsteidShellExtension.wxs @@ -15,7 +15,7 @@ + Language="1033" Version="!(bind.FileVersion.ShellExt)" Manufacturer="RIA" InstallerVersion="500"> @@ -29,7 +29,7 @@ - + diff --git a/extensions/windows/EsteidShlExt.cpp b/extensions/windows/EsteidShlExt.cpp index 341e91b03..20eb6b709 100644 --- a/extensions/windows/EsteidShlExt.cpp +++ b/extensions/windows/EsteidShlExt.cpp @@ -1,12 +1,18 @@ // EsteidShlExt.cpp : Implementation of CEsteidShlExt // http://msdn.microsoft.com/en-us/library/bb757020.aspx -#include "stdafx.h" #include "EsteidShlExt.h" +#include "resource.h" + +#include +#include +#include + +extern HINSTANCE instanceHandle; typedef DWORD ARGB; -bool HasAlpha(ARGB *pargb, SIZE &sizeImage, int cxRow) +bool HasAlpha(ARGB *pargb, const SIZE &sizeImage, int cxRow) { ULONG cxDelta = cxRow - sizeImage.cx; for(ULONG y = sizeImage.cy; y; --y) @@ -23,31 +29,16 @@ bool HasAlpha(ARGB *pargb, SIZE &sizeImage, int cxRow) BITMAPINFO InitBitmapInfo(const SIZE &sizeImage) { - BITMAPINFO pbmi = {}; - pbmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + BITMAPINFO pbmi{{sizeof(BITMAPINFOHEADER)}}; pbmi.bmiHeader.biPlanes = 1; pbmi.bmiHeader.biCompression = BI_RGB; - pbmi.bmiHeader.biWidth = sizeImage.cx; pbmi.bmiHeader.biHeight = sizeImage.cy; pbmi.bmiHeader.biBitCount = 32; return pbmi; } -HBITMAP Create32BitHBITMAP(HDC hdc, const SIZE &sizeImage, void **ppvBits) -{ - BITMAPINFO bmi = InitBitmapInfo(sizeImage); - if (HDC hdcUsed = hdc ? hdc : GetDC(nullptr)) - { - HBITMAP phBmp = CreateDIBSection(hdcUsed, &bmi, DIB_RGB_COLORS, ppvBits, nullptr, 0); - if (hdc != hdcUsed) - ReleaseDC(NULL, hdcUsed); - return phBmp; - } - return nullptr; -} - -HRESULT ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE &sizeImage, int cxRow) +HRESULT ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, const SIZE &sizeImage, int cxRow) { BITMAPINFO bmi = InitBitmapInfo(sizeImage); HRESULT hr = E_OUTOFMEMORY; @@ -77,7 +68,7 @@ HRESULT ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE &sizeImage, in return hr; } -HRESULT ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE &sizeIcon) +HRESULT ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, const SIZE &sizeIcon) { RGBQUAD *prgbQuad; int cxRow = 0; @@ -102,18 +93,24 @@ HRESULT ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, CEsteidShlExt::CEsteidShlExt() { - SIZE sizeIcon = { GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON) }; - if(HICON hIcon = (HICON)LoadImage(_AtlBaseModule.GetModuleInstance(), MAKEINTRESOURCE(IDB_DIGIDOCICO), IMAGE_ICON, sizeIcon.cx, sizeIcon.cy, LR_DEFAULTCOLOR|LR_CREATEDIBSECTION)) + const SIZE sizeIcon { GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON) }; + if(HICON hIcon = (HICON)LoadImage(instanceHandle, MAKEINTRESOURCE(IDB_DIGIDOCICO), IMAGE_ICON, sizeIcon.cx, sizeIcon.cy, LR_DEFAULTCOLOR|LR_CREATEDIBSECTION)) { - if(HDC hdcDest = CreateCompatibleDC(nullptr)) { - if((m_DigidocBmp = Create32BitHBITMAP(hdcDest, sizeIcon, nullptr))) { - if(HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcDest, m_DigidocBmp)) { + if(HDC hdcDest = CreateCompatibleDC(nullptr)) + { + BITMAPINFO bmi = InitBitmapInfo(sizeIcon); + if((m_DigidocBmp = CreateDIBSection(hdcDest, &bmi, DIB_RGB_COLORS, nullptr, nullptr, 0))) + { + if(HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcDest, m_DigidocBmp)) + { RECT rcIcon = { 0, 0, sizeIcon.cx, sizeIcon.cy }; BLENDFUNCTION bfAlpha = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; BP_PAINTPARAMS paintParams = { sizeof(paintParams), BPPF_ERASE, nullptr, &bfAlpha }; HDC hdcBuffer; - if(HPAINTBUFFER hPaintBuffer = BeginBufferedPaint(hdcDest, &rcIcon, BPBF_DIB, &paintParams, &hdcBuffer)) { - if(DrawIconEx(hdcBuffer, 0, 0, hIcon, sizeIcon.cx, sizeIcon.cy, 0, nullptr, DI_NORMAL)) { + if(HPAINTBUFFER hPaintBuffer = BeginBufferedPaint(hdcDest, &rcIcon, BPBF_DIB, &paintParams, &hdcBuffer)) + { + if(DrawIconEx(hdcBuffer, 0, 0, hIcon, sizeIcon.cx, sizeIcon.cy, 0, nullptr, DI_NORMAL)) + { // If icon did not have an alpha channel, we need to convert buffer to PARGB. ConvertBufferToPARGB32(hPaintBuffer, hdcDest, hIcon, sizeIcon); } @@ -136,13 +133,12 @@ CEsteidShlExt::~CEsteidShlExt() STDMETHODIMP CEsteidShlExt::Initialize( LPCITEMIDLIST /* pidlFolder */, LPDATAOBJECT pDataObj, HKEY /* hProgID */) { - FORMATETC fmt = { CF_HDROP, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - STGMEDIUM stg = { TYMED_HGLOBAL }; + FORMATETC fmt{ CF_HDROP, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + STGMEDIUM stg{ TYMED_HGLOBAL }; m_Files.clear(); // Look for CF_HDROP data in the data object. if (FAILED(pDataObj->GetData(&fmt, &stg))) { - // Nope! Return an "invalid argument" error back to Explorer. return E_INVALIDARG; } @@ -153,36 +149,21 @@ STDMETHODIMP CEsteidShlExt::Initialize( return E_INVALIDARG; } - // Sanity check - make sure there is at least one filename. - UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0); - if (nFiles == 0) { - GlobalUnlock(stg.hGlobal); - ReleaseStgMedium(&stg); - return E_INVALIDARG; - } - - for (UINT i = 0; i < nFiles; i++) { + for (UINT i = 0, nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0); i < nFiles; i++) { // Get path length in chars UINT len = DragQueryFile(hDrop, i, nullptr, 0); if (len == 0 || len >= MAX_PATH) continue; // Get the name of the file - TCHAR szFile[MAX_PATH]; - if (DragQueryFile(hDrop, i, szFile, len+1) == 0) - continue; - - tstring str = tstring(szFile); - if (str.empty()) - continue; - - m_Files.push_back(str); + auto &szFile = m_Files.emplace_back(len, 0); + if (DragQueryFile(hDrop, i, szFile.data(), len + 1) != len) + m_Files.pop_back(); } GlobalUnlock(stg.hGlobal); ReleaseStgMedium(&stg); - // Don't show menu if no items were found return m_Files.empty() ? E_INVALIDARG : S_OK; } @@ -194,17 +175,17 @@ STDMETHODIMP CEsteidShlExt::QueryContextMenu( if (uFlags & CMF_DEFAULTONLY) return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); - PCTCH sign = _T("Sign digitally"); - PCTCH encrypt = _T("Encrypt"); + LPCWSTR sign = L"Sign digitally"; + LPCWSTR encrypt = L"Encrypt"; switch (PRIMARYLANGID(GetUserDefaultUILanguage())) { case LANG_ESTONIAN: - sign = _T("Allkirjasta digitaalselt"); - encrypt = _T("Krüpteeri"); + sign = L"Allkirjasta digitaalselt"; + encrypt = L"Krüpteeri"; break; case LANG_RUSSIAN: - sign = _T("Подписать дигитально"); - encrypt = _T("Зашифровать"); + sign = L"Подписать дигитально"; + encrypt = L"Зашифровать"; break; default: break; } @@ -222,8 +203,6 @@ STDMETHODIMP CEsteidShlExt::QueryContextMenu( STDMETHODIMP CEsteidShlExt::GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT * /* pwReserved */, LPSTR pszName, UINT cchMax) { - USES_CONVERSION; - // Check idCmd, it must be 0 or 1 since we have only two menu items. if (idCmd > MENU_ENCRYPT) return E_INVALIDARG; @@ -231,15 +210,19 @@ STDMETHODIMP CEsteidShlExt::GetCommandString( // If Explorer is asking for a help string, copy our string into the // supplied buffer. if (uFlags & GCS_HELPTEXT) { - LPCTSTR szText = idCmd == MENU_SIGN ? _T("Allkirjasta valitud failid digitaalselt") : _T("Krüpteeri valitud failid"); - if (uFlags & GCS_UNICODE) { + LPCWSTR szText = idCmd == MENU_SIGN + ? L"Allkirjasta valitud failid digitaalselt" + : L"Krüpteeri valitud failid"; // We need to cast pszName to a Unicode string, and then use the // Unicode string copy API. - lstrcpynW(LPWSTR(pszName), T2CW(szText), int(cchMax)); + lstrcpynW(LPWSTR(pszName), szText, int(cchMax)); } else { + LPCSTR szText = idCmd == MENU_SIGN + ? "Allkirjasta valitud failid digitaalselt" + : "Krüpteeri valitud failid"; // Use the ANSI string copy API to return the help string. - lstrcpynA(pszName, T2CA(szText), int(cchMax)); + lstrcpynA(pszName, szText, int(cchMax)); } return S_OK; @@ -248,27 +231,19 @@ STDMETHODIMP CEsteidShlExt::GetCommandString( return E_INVALIDARG; } -bool WINAPI CEsteidShlExt::FindRegistryInstallPath(tstring* path) +bool WINAPI CEsteidShlExt::FindRegistryInstallPath(std::wstring &path) { - static PCTCH IDCARD_REGKEY = _T("SOFTWARE\\RIA\\Open-EID"); - static PCTCH IDCARD_REGVALUE = _T("Installed"); - HKEY hkey; - DWORD dwSize = MAX_PATH * sizeof(TCHAR); - TCHAR szInstalldir[MAX_PATH]; - LSTATUS dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, IDCARD_REGKEY, 0, KEY_QUERY_VALUE, &hkey); - if (dwRet == ERROR_SUCCESS) { - dwRet = RegQueryValueEx(hkey, IDCARD_REGVALUE, nullptr, nullptr, LPBYTE(szInstalldir), &dwSize); - RegCloseKey(hkey); - *path = tstring(szInstalldir); - return true; - } - dwRet = RegOpenKeyEx(HKEY_CURRENT_USER, IDCARD_REGKEY, 0, KEY_QUERY_VALUE, &hkey); - if (dwRet == ERROR_SUCCESS) { - RegCloseKey(hkey); - *path = tstring(szInstalldir); - return true; - } - return false; + HKEY hkey{}; + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\RIA\\Open-EID", 0, KEY_QUERY_VALUE, &hkey) != ERROR_SUCCESS) + return false; + DWORD dwSize = path.size() * sizeof(TCHAR); + bool result = true; + if(RegQueryValueEx(hkey, L"Installed", nullptr, nullptr, LPBYTE(path.data()), &dwSize) == ERROR_SUCCESS) + path.resize(dwSize / sizeof(TCHAR) - 1); // size includes any terminating null + else + result = false; + RegCloseKey(hkey); + return result; } STDMETHODIMP CEsteidShlExt::ExecuteDigidocclient(LPCMINVOKECOMMANDINFO /* pCmdInfo */, bool crypto) @@ -276,31 +251,27 @@ STDMETHODIMP CEsteidShlExt::ExecuteDigidocclient(LPCMINVOKECOMMANDINFO /* pCmdIn if (m_Files.empty()) return E_INVALIDARG; - tstring path(MAX_PATH, 0); - tstring command(MAX_PATH, 0); + std::wstring path(MAX_PATH, 0); // Read the location of the installation from registry - if (!FindRegistryInstallPath(&path)) { - // .. and fall back to directory where shellext resides if not found from registry - GetModuleFileName(_AtlBaseModule.m_hInst, &path[0], MAX_PATH); - path.resize(path.find_last_of(_T('\\')) + 1); - } - - command = path + _T("qdigidoc4.exe"); - if(PathFileExists(command.c_str()) != 1) { - // Replace "c:\Program Files\" with "c:\Program Files (x86)\" - command.insert(16, _T(" (x86)")); + if (!FindRegistryInstallPath(path)) { + // .. and fall back to directory where shellext resides if not found from registry + GetModuleFileName(instanceHandle, path.data(), path.size()); + path.resize(path.find_last_of(L'\\') + 1); } + path += L"qdigidoc4.exe"; // Construct command line arguments to pass to qdigidocclient.exe - tstring parameters = crypto ? _T("\"-crypto\" ") : _T("\"-sign\" "); - for (const tstring &file: m_Files) - parameters += _T("\"") + file + _T("\" "); - - SHELLEXECUTEINFO seInfo = { sizeof(SHELLEXECUTEINFO) }; - seInfo.lpFile = command.c_str(); - seInfo.lpParameters = parameters.c_str(); - seInfo.nShow = SW_SHOW; + std::wstring parameters = crypto ? L"\"-crypto\" " : L"\"-sign\" "; + for (const auto &file: m_Files) + parameters += L"\"" + file + L"\" "; + + SHELLEXECUTEINFO seInfo{ + .cbSize = sizeof(SHELLEXECUTEINFO), + .lpFile = path.c_str(), + .lpParameters = parameters.c_str(), + .nShow = SW_SHOW + }; return ShellExecuteEx(&seInfo) ? S_OK : S_FALSE; } diff --git a/extensions/windows/EsteidShlExt.h b/extensions/windows/EsteidShlExt.h index 5d2569935..7f6f62571 100644 --- a/extensions/windows/EsteidShlExt.h +++ b/extensions/windows/EsteidShlExt.h @@ -1,41 +1,34 @@ // EsteidShlExt.h : Declaration of the CEsteidShlExt #pragma once -#include "resource.h" // main symbols -#include "EsteidShellExtension_i.h" +#include "targetver.h" -#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA) -#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms." -#endif +#include +#include +#include +#include +#include -class ATL_NO_VTABLE CEsteidShlExt : - public CComObjectRootEx, - public CComCoClass, - public IShellExtInit, - public IContextMenu +class +#ifdef _WIN64 + __declspec(uuid("5606A547-759D-43DA-AEEB-D3BF1D1E816D")) +#else + __declspec(uuid("310AAB39-76FE-401B-8A7F-0F578C5F6AB5")) +#endif + CEsteidShlExt : public winrt::implements { public: CEsteidShlExt(); ~CEsteidShlExt(); - DECLARE_NO_REGISTRY() - DECLARE_NOT_AGGREGATABLE(CEsteidShlExt) - - BEGIN_COM_MAP(CEsteidShlExt) - COM_INTERFACE_ENTRY(IShellExtInit) - COM_INTERFACE_ENTRY(IContextMenu) - END_COM_MAP() - - DECLARE_PROTECT_FINAL_CONSTRUCT() - // IShellExtInit - STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY) override; + STDMETHODIMP Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pdtobj, HKEY hkeyProgID) final; // IContextMenu - STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT) override; - STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO) override; - STDMETHODIMP GetCommandString(UINT_PTR, UINT, UINT*, LPSTR, UINT) override; + STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT) final; + STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO) final; + STDMETHODIMP GetCommandString(UINT_PTR, UINT, UINT *, LPSTR, UINT) final; private: enum { @@ -43,12 +36,9 @@ class ATL_NO_VTABLE CEsteidShlExt : MENU_ENCRYPT = 1, }; - using tstring = std::basic_string; - bool WINAPI FindRegistryInstallPath(tstring* path); + bool WINAPI FindRegistryInstallPath(std::wstring &path); STDMETHODIMP ExecuteDigidocclient(LPCMINVOKECOMMANDINFO pCmdInfo, bool crypto = false); HBITMAP m_DigidocBmp = nullptr; - std::vector m_Files; + std::vector m_Files; }; - -OBJECT_ENTRY_AUTO(__uuidof(EsteidShlExt), CEsteidShlExt) diff --git a/extensions/windows/dllmain.cpp b/extensions/windows/dllmain.cpp index b7ac18b9c..91489a24f 100644 --- a/extensions/windows/dllmain.cpp +++ b/extensions/windows/dllmain.cpp @@ -1,27 +1,61 @@ // dllmain.cpp : Implementation of DllMain. -#include "stdafx.h" -#include "resource.h" -#include "EsteidShellExtension_i.h" -#include "dllmain.h" +#include "EsteidShlExt.h" -CEsteidShellExtensionModule _AtlModule; +HINSTANCE instanceHandle{}; // DLL Entry Point -extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { - hInstance; - return _AtlModule.DllMain(dwReason, lpReserved); + switch (dwReason) { + case DLL_PROCESS_ATTACH: + instanceHandle = hModule; + DisableThreadLibraryCalls(hModule); + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; } +struct CEsteidShlExtFactory : winrt::implements +{ + STDMETHODIMP CreateInstance( + IUnknown *pUnkOuter, REFIID riid, LPVOID *ppvObject) noexcept final try { + return winrt::make().as(riid, ppvObject); + } catch (...) { + return winrt::to_hresult(); + } + + STDMETHODIMP LockServer(BOOL fLock) noexcept final { + return S_OK; + } +}; + // Used to determine whether the DLL can be unloaded by OLE -STDAPI DllCanUnloadNow(void) +STDMETHODIMP DllCanUnloadNow() { - return _AtlModule.DllCanUnloadNow(); + if (winrt::get_module_lock()) { + return S_FALSE; + } + + winrt::clear_factory_cache(); + return S_OK; } // Returns a class factory to create an object of the requested type -STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +STDMETHODIMP DllGetClassObject(const GUID &clsid, const GUID &iid, LPVOID *result) try { - return _AtlModule.DllGetClassObject(rclsid, riid, ppv); -} \ No newline at end of file + *result = nullptr; + + if (clsid == __uuidof(CEsteidShlExt)) { + return winrt::make().as(iid, result); + } + + return winrt::hresult_class_not_available().to_abi(); +} catch (...) { + return winrt::to_hresult(); +} diff --git a/extensions/windows/dllmain.h b/extensions/windows/dllmain.h deleted file mode 100644 index f63226e07..000000000 --- a/extensions/windows/dllmain.h +++ /dev/null @@ -1,7 +0,0 @@ -// dllmain.h : Declaration of module class. - -class CEsteidShellExtensionModule : public CAtlDllModuleT< CEsteidShellExtensionModule > -{ -public : - DECLARE_LIBID(LIBID_EsteidShellExtensionLib) -}; diff --git a/extensions/windows/stdafx.cpp b/extensions/windows/stdafx.cpp deleted file mode 100644 index c77aa0f6c..000000000 --- a/extensions/windows/stdafx.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// EsteidShellExtension.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" diff --git a/extensions/windows/stdafx.h b/extensions/windows/stdafx.h deleted file mode 100644 index 3674e3cd7..000000000 --- a/extensions/windows/stdafx.h +++ /dev/null @@ -1,27 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef STRICT -#define STRICT -#endif - -#include "targetver.h" - -#define _ATL_APARTMENT_THREADED -#define _ATL_NO_AUTOMATIC_NAMESPACE - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -#include "resource.h" -#include -#include -#include -#include -#include -#include -#include - -using namespace ATL;