2 * Copyright (C) 2008 Google (Roy Shea)
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "mstask_private.h"
25 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(mstask
);
30 static HINSTANCE hInst
;
33 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
35 TRACE("(%p, %d, %p)\n", hinstDLL
, fdwReason
, lpvReserved
);
39 case DLL_WINE_PREATTACH
:
41 case DLL_PROCESS_ATTACH
:
42 DisableThreadLibraryCalls(hinstDLL
);
45 case DLL_PROCESS_DETACH
:
52 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID iid
, LPVOID
*ppv
)
54 TRACE("(%s %s %p)\n", debugstr_guid(rclsid
), debugstr_guid(iid
), ppv
);
56 if (IsEqualGUID(rclsid
, &CLSID_CTaskScheduler
)) {
57 return IClassFactory_QueryInterface((LPCLASSFACTORY
)&MSTASK_ClassFactory
, iid
, ppv
);
60 FIXME("Not supported class: %s\n", debugstr_guid(rclsid
));
61 return CLASS_E_CLASSNOTAVAILABLE
;
64 HRESULT WINAPI
DllCanUnloadNow(void)
66 return dll_ref
!= 0 ? S_FALSE
: S_OK
;
69 static inline char *mstask_strdup(const char *s
)
71 size_t n
= strlen(s
) + 1;
72 char *d
= HeapAlloc(GetProcessHeap(), 0, n
);
73 return d
? memcpy(d
, s
, n
) : NULL
;
76 static HRESULT
init_register_strtable(STRTABLEA
*strtable
)
78 #define CLSID_EXPANSION_ENTRY(id) { "CLSID_" #id, &CLSID_ ## id }
86 CLSID_EXPANSION_ENTRY(CTaskScheduler
),
87 CLSID_EXPANSION_ENTRY(CTask
)
89 #undef CLSID_EXPANSION_ENTRY
90 static STRENTRYA pse
[sizeof expns
/ sizeof expns
[0]];
93 strtable
->cEntries
= sizeof pse
/ sizeof pse
[0];
95 for (i
= 0; i
< strtable
->cEntries
; i
++)
97 static const char dummy_sample
[] =
98 "{12345678-1234-1234-1234-123456789012}";
99 const CLSID
*clsid
= expns
[i
].clsid
;
100 pse
[i
].pszName
= mstask_strdup(expns
[i
].name
);
101 pse
[i
].pszValue
= HeapAlloc(GetProcessHeap(), 0, sizeof dummy_sample
);
102 if (!pse
[i
].pszName
|| !pse
[i
].pszValue
)
103 return E_OUTOFMEMORY
;
104 sprintf(pse
[i
].pszValue
,
105 "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
106 clsid
->Data1
, clsid
->Data2
, clsid
->Data3
, clsid
->Data4
[0],
107 clsid
->Data4
[1], clsid
->Data4
[2], clsid
->Data4
[3],
108 clsid
->Data4
[4], clsid
->Data4
[5], clsid
->Data4
[6],
115 static void cleanup_register_strtable(STRTABLEA
*strtable
)
118 for (i
= 0; i
< strtable
->cEntries
; i
++)
120 HeapFree(GetProcessHeap(), 0, strtable
->pse
[i
].pszName
);
121 HeapFree(GetProcessHeap(), 0, strtable
->pse
[i
].pszValue
);
122 if (!strtable
->pse
[i
].pszName
|| !strtable
->pse
[i
].pszValue
)
127 static HRESULT
register_mstask(BOOL do_register
)
132 HRESULT (WINAPI
*pRegInstall
)(HMODULE hm
,
133 LPCSTR pszSection
, const STRTABLEA
* pstTable
);
134 static const WCHAR wszAdvpack
[] =
135 {'a','d','v','p','a','c','k','.','d','l','l',0};
137 TRACE("(%x)\n", do_register
);
139 hAdvpack
= LoadLibraryW(wszAdvpack
);
140 pRegInstall
= (void *)GetProcAddress(hAdvpack
, "RegInstall");
142 hr
= init_register_strtable(&strtable
);
144 hr
= pRegInstall(hInst
, do_register
? "RegisterDll" : "UnregisterDll",
146 cleanup_register_strtable(&strtable
);
149 WINE_ERR("RegInstall failed: %08x\n", hr
);
154 HRESULT WINAPI
DllRegisterServer(void)
156 return register_mstask(TRUE
);
159 HRESULT WINAPI
DllUnregisterServer(void)
161 return register_mstask(FALSE
);