xref: /reactos/dll/shellext/sendmail/sendmail.cpp (revision b8dd046e)
1 /*
2  * PROJECT:     sendmail
3  * LICENSE:     LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4  * PURPOSE:     DeskLink implementation
5  * COPYRIGHT:   Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6  */
7 
8 #include "precomp.hpp"
9 
10 WINE_DEFAULT_DEBUG_CHANNEL(sendmail);
11 
12 BEGIN_OBJECT_MAP(ObjectMap)
13     OBJECT_ENTRY(CLSID_DeskLinkDropHandler, CDeskLinkDropHandler)
14 END_OBJECT_MAP()
15 
16 CComModule gModule;
17 LONG g_ModuleRefCnt = 0;
18 
19 STDAPI DllCanUnloadNow(void)
20 {
21     if (g_ModuleRefCnt)
22         return S_FALSE;
23     return gModule.DllCanUnloadNow();
24 }
25 
26 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
27 {
28     TRACE("CLSID:%s,IID:%s\n", wine_dbgstr_guid(&rclsid), wine_dbgstr_guid(&riid));
29 
30     HRESULT hr = gModule.DllGetClassObject(rclsid, riid, ppv);
31 
32     TRACE("-- pointer to class factory: %p\n", *ppv);
33 
34     return hr;
35 }
36 
37 STDAPI DllRegisterServer(void)
38 {
39     HRESULT hr = gModule.DllRegisterServer(FALSE);
40     if (FAILED_UNEXPECTEDLY(hr))
41         return hr;
42 
43     return S_OK;
44 }
45 
46 STDAPI DllUnregisterServer(void)
47 {
48     HRESULT hr = gModule.DllUnregisterServer(FALSE);
49     if (FAILED_UNEXPECTEDLY(hr))
50         return hr;
51 
52     return S_OK;
53 }
54 
55 HRESULT
56 CreateShellLink(
57     LPCWSTR pszLinkPath,
58     LPCWSTR pszTargetPath OPTIONAL,
59     LPCITEMIDLIST pidlTarget OPTIONAL,
60     LPCWSTR pszArg OPTIONAL,
61     LPCWSTR pszDir OPTIONAL,
62     LPCWSTR pszIconPath OPTIONAL,
63     INT iIconNr OPTIONAL,
64     LPCWSTR pszComment OPTIONAL)
65 {
66     CComPtr<IShellLinkW> psl;
67     HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL,
68                                   CLSCTX_INPROC_SERVER,
69                                   IID_PPV_ARG(IShellLinkW, &psl));
70     if (FAILED_UNEXPECTEDLY(hr))
71         return hr;
72 
73     if (pszTargetPath)
74     {
75         hr = psl->SetPath(pszTargetPath);
76         if (FAILED_UNEXPECTEDLY(hr))
77             return hr;
78     }
79     else if (pidlTarget)
80     {
81         hr = psl->SetIDList(pidlTarget);
82         if (FAILED_UNEXPECTEDLY(hr))
83             return hr;
84     }
85     else
86     {
87         ERR("invalid argument\n");
88         return E_INVALIDARG;
89     }
90 
91     if (pszArg)
92         hr = psl->SetArguments(pszArg);
93 
94     if (pszDir)
95         hr = psl->SetWorkingDirectory(pszDir);
96 
97     if (pszIconPath)
98         hr = psl->SetIconLocation(pszIconPath, iIconNr);
99 
100     if (pszComment)
101         hr = psl->SetDescription(pszComment);
102 
103     CComPtr<IPersistFile> ppf;
104     hr = psl->QueryInterface(IID_PPV_ARG(IPersistFile, &ppf));
105     if (FAILED_UNEXPECTEDLY(hr))
106         return hr;
107 
108     hr = ppf->Save(pszLinkPath, TRUE);
109     if (FAILED_UNEXPECTEDLY(hr))
110         return hr;
111 
112     return hr;
113 }
114 
115 STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID fImpLoad)
116 {
117     TRACE("%p 0x%x %p\n", hInstance, dwReason, fImpLoad);
118     if (dwReason == DLL_PROCESS_ATTACH)
119     {
120         gModule.Init(ObjectMap, hInstance, NULL);
121         DisableThreadLibraryCalls(hInstance);
122     }
123     else if (dwReason == DLL_PROCESS_DETACH)
124     {
125         gModule.Term();
126     }
127     return TRUE;
128 }
129