2 #include "menuengine.h"
8 * Since COM objects cannot be constructed like your traditional object (i.e.
9 * with a proper constructor), they have to be constructed by another object,
12 * The class factory is an object which exists exactly once, and it cannot
13 * be constructed or destroyed. Its sole purpose is to construct objects
17 STDMETHODIMP
class_factory_query_interface(IClassFactory
*this,
18 REFIID guid
, void **pointer
)
20 if (!IsEqualIID(guid
, &IID_IUnknown
) &&
21 !IsEqualIID(guid
, &IID_IClassFactory
)) {
30 static ULONG STDMETHODCALLTYPE
return_one(IClassFactory
*this)
35 static STDMETHODIMP
create_instance(IClassFactory
*this_
,
36 IUnknown
*outer
, REFIID guid
, void **pointer
)
39 struct git_data
*data
;
44 return CLASS_E_NOAGGREGATION
;
46 if (!(data
= GlobalAlloc(GMEM_FIXED
, sizeof(struct git_data
))))
48 memset(data
, 0, sizeof(struct git_data
));
50 data
->shell_ext
.virtual_table
= &git_shell_ext_virtual_table
;
51 data
->menu
.virtual_table
= &git_menu_virtual_table
;
52 data
->shell_ext
.git_data
= data
->menu
.git_data
= data
;
54 result
= query_interface_git_data(data
, guid
, pointer
);
56 InterlockedIncrement(&object_count
);
60 static STDMETHODIMP
lock_server(IClassFactory
*this, BOOL lock
)
63 InterlockedIncrement(&lock_count
);
65 InterlockedDecrement(&lock_count
);
70 IClassFactoryVtbl factory_virtual_table
= {
71 class_factory_query_interface
,
78 IClassFactory factory
= {
79 &factory_virtual_table