@@ -167,7 +167,7 @@ HRESULT ReadAllIdleInstalls(std::vector<IdleData> &idles, HKEY hive, LPCWSTR roo
167167}
168168
169169class DECLSPEC_UUID (CLSID_LAUNCH_COMMAND) LaunchCommand
170- : public RuntimeClass<RuntimeClassFlags<ClassicCom>, IExplorerCommand>
170+ : public RuntimeClass<RuntimeClassFlags<ClassicCom>, IExplorerCommand, IObjectWithSite >
171171{
172172 std::wstring title;
173173 std::wstring exe;
@@ -269,6 +269,26 @@ class DECLSPEC_UUID(CLSID_LAUNCH_COMMAND) LaunchCommand
269269 *ppEnum = NULL ;
270270 return E_NOTIMPL;
271271 }
272+
273+ // IObjectWithSite
274+ private:
275+ ComPtr<IUnknown> _site;
276+
277+ public:
278+ IFACEMETHODIMP GetSite (REFIID riid, void **ppvSite)
279+ {
280+ if (_site) {
281+ return _site->QueryInterface (riid, ppvSite);
282+ }
283+ *ppvSite = NULL ;
284+ return E_FAIL;
285+ }
286+
287+ IFACEMETHODIMP SetSite (IUnknown *pSite)
288+ {
289+ _site = pSite;
290+ return S_OK;
291+ }
272292};
273293
274294
@@ -316,7 +336,7 @@ class DECLSPEC_UUID(CLSID_COMMAND_ENUMERATOR) CommandEnumerator
316336
317337
318338class DECLSPEC_UUID (CLSID_IDLE_COMMAND) IdleCommand
319- : public RuntimeClass<RuntimeClassFlags<ClassicCom>, IExplorerCommand>
339+ : public RuntimeClass<RuntimeClassFlags<ClassicCom>, IExplorerCommand, IObjectWithSite >
320340{
321341 std::vector<IdleData> idles;
322342 std::wstring iconPath;
@@ -432,12 +452,33 @@ class DECLSPEC_UUID(CLSID_IDLE_COMMAND) IdleCommand
432452 ).Detach ();
433453 return S_OK;
434454 }
455+
456+ // IObjectWithSite
457+ private:
458+ ComPtr<IUnknown> _site;
459+
460+ public:
461+ IFACEMETHODIMP GetSite (REFIID riid, void **ppvSite)
462+ {
463+ if (_site) {
464+ return _site->QueryInterface (riid, ppvSite);
465+ }
466+ *ppvSite = NULL ;
467+ return E_FAIL;
468+ }
469+
470+ IFACEMETHODIMP SetSite (IUnknown *pSite)
471+ {
472+ _site = pSite;
473+ return S_OK;
474+ }
435475};
436476
437477
438478CoCreatableClass (IdleCommand);
439479
440480#ifdef PYSHELLEXT_TEST
481+
441482IExplorerCommand *MakeLaunchCommand (std::wstring title, std::wstring exe, std::wstring idle)
442483{
443484 IdleData data = { .title = title, .exe = exe, .idle = idle };
@@ -449,10 +490,31 @@ IExplorerCommand *MakeIdleCommand(HKEY hive, LPCWSTR root)
449490{
450491 return Make<IdleCommand>(hive, root).Detach ();
451492}
452- #endif
453493
494+ #elif defined(_WINDLL)
495+
496+ STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, _COM_Outptr_ void ** ppv)
497+ {
498+ return Module<InProc>::GetModule ().GetClassObject (rclsid, riid, ppv);
499+ }
500+
501+
502+ STDAPI DllCanUnloadNow ()
503+ {
504+ return Module<InProc>::GetModule ().Terminate () ? S_OK : S_FALSE;
505+ }
506+
507+ STDAPI_ (BOOL) DllMain(_In_opt_ HINSTANCE hinst, DWORD reason, _In_opt_ void *)
508+ {
509+ if (reason == DLL_PROCESS_ATTACH) {
510+ hModule = hinst;
511+ DisableThreadLibraryCalls (hinst);
512+ }
513+ return TRUE ;
514+ }
515+
516+ #else
454517
455- #ifndef PYSHELLEXT_TEST
456518class OutOfProcModule : public Module <OutOfProc, OutOfProcModule>
457519{ };
458520
@@ -475,4 +537,5 @@ int WINAPI wWinMain(
475537 CoUninitialize ();
476538 return 0 ;
477539}
540+
478541#endif
0 commit comments