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