forked from Mirrors/wine-wine
mstask: Implement ClassFactory, DllGetClassObject, and DllCanUnloadNow.
parent
74dc990bbf
commit
dab039630c
|
@ -6,6 +6,7 @@ MODULE = mstask.dll
|
||||||
IMPORTS = uuid kernel32
|
IMPORTS = uuid kernel32
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
|
factory.c \
|
||||||
mstask_main.c \
|
mstask_main.c \
|
||||||
task_scheduler.c
|
task_scheduler.c
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Google (Roy Shea)
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mstask_private.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(mstask);
|
||||||
|
|
||||||
|
static HRESULT WINAPI MSTASK_IClassFactory_QueryInterface(
|
||||||
|
LPCLASSFACTORY iface,
|
||||||
|
REFIID riid,
|
||||||
|
LPVOID *ppvObj)
|
||||||
|
{
|
||||||
|
ClassFactoryImpl *This = (ClassFactoryImpl *)iface;
|
||||||
|
|
||||||
|
TRACE("IID: %s\n",debugstr_guid(riid));
|
||||||
|
if (ppvObj == NULL)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
if (IsEqualGUID(riid, &IID_IUnknown) ||
|
||||||
|
IsEqualGUID(riid, &IID_IClassFactory))
|
||||||
|
{
|
||||||
|
*ppvObj = &This->lpVtbl;
|
||||||
|
IClassFactory_AddRef(iface);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN("Unknown interface: %s\n", debugstr_guid(riid));
|
||||||
|
*ppvObj = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI MSTASK_IClassFactory_AddRef(LPCLASSFACTORY iface)
|
||||||
|
{
|
||||||
|
TRACE("\n");
|
||||||
|
InterlockedIncrement(&dll_ref);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI MSTASK_IClassFactory_Release(LPCLASSFACTORY iface)
|
||||||
|
{
|
||||||
|
TRACE("\n");
|
||||||
|
InterlockedDecrement(&dll_ref);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI MSTASK_IClassFactory_CreateInstance(
|
||||||
|
LPCLASSFACTORY iface,
|
||||||
|
LPUNKNOWN pUnkOuter,
|
||||||
|
REFIID riid,
|
||||||
|
LPVOID *ppvObj)
|
||||||
|
{
|
||||||
|
HRESULT res;
|
||||||
|
IUnknown *punk = NULL;
|
||||||
|
*ppvObj = NULL;
|
||||||
|
|
||||||
|
TRACE("IID: %s\n",debugstr_guid(riid));
|
||||||
|
|
||||||
|
if (pUnkOuter)
|
||||||
|
return CLASS_E_NOAGGREGATION;
|
||||||
|
|
||||||
|
res = TaskSchedulerConstructor((LPVOID*) &punk);
|
||||||
|
if (FAILED(res))
|
||||||
|
return res;
|
||||||
|
|
||||||
|
res = ITaskScheduler_QueryInterface(punk, riid, ppvObj);
|
||||||
|
ITaskScheduler_Release(punk);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI MSTASK_IClassFactory_LockServer(
|
||||||
|
LPCLASSFACTORY iface,
|
||||||
|
BOOL fLock)
|
||||||
|
{
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
if (fLock != FALSE)
|
||||||
|
MSTASK_IClassFactory_AddRef(iface);
|
||||||
|
else
|
||||||
|
MSTASK_IClassFactory_Release(iface);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IClassFactoryVtbl IClassFactory_Vtbl =
|
||||||
|
{
|
||||||
|
MSTASK_IClassFactory_QueryInterface,
|
||||||
|
MSTASK_IClassFactory_AddRef,
|
||||||
|
MSTASK_IClassFactory_Release,
|
||||||
|
MSTASK_IClassFactory_CreateInstance,
|
||||||
|
MSTASK_IClassFactory_LockServer
|
||||||
|
};
|
||||||
|
|
||||||
|
ClassFactoryImpl MSTASK_ClassFactory = { &IClassFactory_Vtbl };
|
|
@ -1,6 +1,6 @@
|
||||||
@ stub ConvertAtJobsToTasks
|
@ stub ConvertAtJobsToTasks
|
||||||
@ stub DllCanUnloadNow
|
@ stdcall -private DllCanUnloadNow()
|
||||||
@ stub DllGetClassObject
|
@ stdcall -private DllGetClassObject(ptr ptr ptr)
|
||||||
@ stub GetNetScheduleAccountInformation
|
@ stub GetNetScheduleAccountInformation
|
||||||
@ stub NetrJobAdd
|
@ stub NetrJobAdd
|
||||||
@ stub NetrJobDel
|
@ stub NetrJobDel
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mstask);
|
WINE_DEFAULT_DEBUG_CHANNEL(mstask);
|
||||||
|
|
||||||
|
LONG dll_ref = 0;
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
|
TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
|
||||||
|
@ -38,3 +40,20 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
TRACE("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
|
||||||
|
|
||||||
|
if (IsEqualGUID(rclsid, &CLSID_CTaskScheduler)) {
|
||||||
|
return IClassFactory_QueryInterface((LPCLASSFACTORY)&MSTASK_ClassFactory, iid, ppv);
|
||||||
|
}
|
||||||
|
|
||||||
|
FIXME("Not supported class: %s\n", debugstr_guid(rclsid));
|
||||||
|
return CLASS_E_CLASSNOTAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI DllCanUnloadNow(void)
|
||||||
|
{
|
||||||
|
return dll_ref != 0 ? S_FALSE : S_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,15 @@
|
||||||
#include "ole2.h"
|
#include "ole2.h"
|
||||||
#include "mstask.h"
|
#include "mstask.h"
|
||||||
|
|
||||||
|
extern LONG dll_ref;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const IClassFactoryVtbl *lpVtbl;
|
||||||
|
LONG ref;
|
||||||
|
} ClassFactoryImpl;
|
||||||
|
extern ClassFactoryImpl MSTASK_ClassFactory;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const ITaskSchedulerVtbl *lpVtbl;
|
const ITaskSchedulerVtbl *lpVtbl;
|
||||||
|
|
|
@ -25,6 +25,7 @@ static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
|
||||||
{
|
{
|
||||||
TRACE("%p\n", This);
|
TRACE("%p\n", This);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
InterlockedDecrement(&dll_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface(
|
static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface(
|
||||||
|
@ -170,5 +171,6 @@ HRESULT TaskSchedulerConstructor(LPVOID *ppObj)
|
||||||
This->ref = 1;
|
This->ref = 1;
|
||||||
|
|
||||||
*ppObj = &This->lpVtbl;
|
*ppObj = &This->lpVtbl;
|
||||||
|
InterlockedIncrement(&dll_ref);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue