dllmain.cpp
1 #include "pch.h" 2 #include "Generated Files/resource.h" 3 #include "ImageResizerExt_i.h" 4 #include "dllmain.h" 5 6 #include <ImageResizerConstants.h> 7 #include <Settings.h> 8 #include <trace.h> 9 10 #include <common/logger/logger.h> 11 #include <common/SettingsAPI/settings_objects.h> 12 #include <common/utils/package.h> 13 #include <common/utils/process_path.h> 14 #include <common/utils/resources.h> 15 #include <common/utils/logger_helper.h> 16 #include <interface/powertoy_module_interface.h> 17 #include "RuntimeRegistration.h" 18 19 CImageResizerExtModule _AtlModule; 20 HINSTANCE g_hInst_imageResizer = 0; 21 22 extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 23 { 24 switch (dwReason) 25 { 26 case DLL_PROCESS_ATTACH: 27 g_hInst_imageResizer = hInstance; 28 Trace::RegisterProvider(); 29 break; 30 case DLL_PROCESS_DETACH: 31 Trace::UnregisterProvider(); 32 break; 33 } 34 return _AtlModule.DllMain(dwReason, lpReserved); 35 } 36 37 class ImageResizerModule : public PowertoyModuleIface 38 { 39 private: 40 // Enabled by default 41 bool m_enabled = false; 42 std::wstring app_name; 43 //contains the non localized key of the powertoy 44 std::wstring app_key; 45 46 // Update registration based on enabled state 47 void UpdateRegistration(bool enabled) 48 { 49 if (enabled) 50 { 51 #if defined(ENABLE_REGISTRATION) || defined(NDEBUG) 52 ImageResizerRuntimeRegistration::EnsureRegistered(); 53 Logger::info(L"ImageResizer context menu registered"); 54 #endif 55 } 56 else 57 { 58 #if defined(ENABLE_REGISTRATION) || defined(NDEBUG) 59 ImageResizerRuntimeRegistration::Unregister(); 60 Logger::info(L"ImageResizer context menu unregistered"); 61 #endif 62 } 63 } 64 65 66 public: 67 // Constructor 68 ImageResizerModule() 69 { 70 m_enabled = CSettingsInstance().GetEnabled(); 71 UpdateRegistration(m_enabled); 72 app_name = GET_RESOURCE_STRING(IDS_IMAGERESIZER); 73 app_key = ImageResizerConstants::ModuleKey; 74 LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::imageResizerLoggerName); 75 }; 76 77 // Destroy the powertoy and free memory 78 virtual void destroy() override 79 { 80 delete this; 81 } 82 83 // Return the localized display name of the powertoy 84 virtual const wchar_t* get_name() override 85 { 86 return app_name.c_str(); 87 } 88 89 // Return the non localized key of the powertoy, this will be cached by the runner 90 virtual const wchar_t* get_key() override 91 { 92 return app_key.c_str(); 93 } 94 95 // Return the configured status for the gpo policy for the module 96 virtual powertoys_gpo::gpo_rule_configured_t gpo_policy_enabled_configuration() override 97 { 98 return powertoys_gpo::getConfiguredImageResizerEnabledValue(); 99 } 100 101 // Return JSON with the configuration options. 102 virtual bool get_config(wchar_t* buffer, int* buffer_size) override 103 { 104 HINSTANCE hinstance = reinterpret_cast<HINSTANCE>(&__ImageBase); 105 106 // Create a Settings object. 107 PowerToysSettings::Settings settings(hinstance, get_name()); 108 settings.set_description(GET_RESOURCE_STRING(IDS_SETTINGS_DESCRIPTION)); 109 settings.set_overview_link(L"https://aka.ms/PowerToysOverview_ImageResizer"); 110 settings.set_icon_key(L"pt-image-resizer"); 111 settings.add_header_szLarge(L"imageresizer_settingsheader", GET_RESOURCE_STRING(IDS_SETTINGS_HEADER_DESCRIPTION), GET_RESOURCE_STRING(IDS_SETTINGS_HEADER)); 112 return settings.serialize_to_buffer(buffer, buffer_size); 113 } 114 115 // Signal from the Settings editor to call a custom action. 116 // This can be used to spawn more complex editors. 117 virtual void call_custom_action(const wchar_t* /*action*/) override {} 118 119 // Called by the runner to pass the updated settings values as a serialized JSON. 120 virtual void set_config(const wchar_t* /*config*/) override {} 121 122 // Enable the powertoy 123 virtual void enable() 124 { 125 m_enabled = true; 126 127 if (package::IsWin11OrGreater()) 128 { 129 std::wstring path = get_module_folderpath(g_hInst_imageResizer); 130 std::wstring packageUri = path + L"\\ImageResizerContextMenuPackage.msix"; 131 if (!package::IsPackageRegisteredWithPowerToysVersion(ImageResizerConstants::ModulePackageDisplayName)) 132 { 133 package::RegisterSparsePackage(path, packageUri); 134 } 135 } 136 UpdateRegistration(m_enabled); 137 Trace::EnableImageResizer(m_enabled); 138 } 139 140 // Disable the powertoy 141 virtual void disable() 142 { 143 m_enabled = false; 144 UpdateRegistration(m_enabled); 145 Trace::EnableImageResizer(m_enabled); 146 } 147 148 // Returns if the powertoys is enabled 149 virtual bool is_enabled() override 150 { 151 return m_enabled; 152 } 153 }; 154 155 extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() 156 { 157 return new ImageResizerModule(); 158 }