Um, you missed almost much every implementation of a COM interface in the entire dll?
2012/3/10 André Hentschel nerv@dawncrow.de:
Needed for dotNet 4.5 preview
dlls/windowscodecs/clsfactory.c | 15 +++++++++++++-- dlls/windowscodecs/main.c | 9 +++++++++ dlls/windowscodecs/wincodecs_private.h | 12 ++++++++++++ dlls/windowscodecs/windowscodecs.spec | 1 + 4 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index 0f30115..bd22ce5 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -112,7 +112,10 @@ static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface) TRACE("(%p) refcount=%u\n", iface, ref);
if (ref == 0)
- {
HeapFree(GetProcessHeap(), 0, This);
- unlock_module();
- }
return ref; } @@ -127,8 +130,14 @@ static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface,
static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock) {
- TRACE("(%p, %i): stub\n", iface, lock);
- return E_NOTIMPL;
- TRACE("(%p,%x)\n", iface, lock);
- if(lock)
- lock_module();
- else
- unlock_module();
- return S_OK;
}
static const IClassFactoryVtbl ClassFactoryImpl_Vtbl = { @@ -146,6 +155,8 @@ static HRESULT ClassFactoryImpl_Constructor(classinfo *info, REFIID riid, LPVOID
*ppv = NULL;
- lock_module();
This = HeapAlloc(GetProcessHeap(), 0, sizeof(ClassFactoryImpl)); if (!This) return E_OUTOFMEMORY;
diff --git a/dlls/windowscodecs/main.c b/dlls/windowscodecs/main.c index a6588fd..69e50f5 100644 --- a/dlls/windowscodecs/main.c +++ b/dlls/windowscodecs/main.c @@ -32,6 +32,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+LONG module_ref = 0;
extern BOOL WINAPI WIC_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) @@ -49,6 +51,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return WIC_DllMain(hinstDLL, fdwReason, lpvReserved); }
+HRESULT WINAPI DllCanUnloadNow(void) +{
- TRACE("() ref=%d\n", module_ref);
- return module_ref ? S_FALSE : S_OK;
+}
HRESULT copy_pixels(UINT bpp, const BYTE *srcbuffer, UINT srcwidth, UINT srcheight, INT srcstride, const WICRect *rc, UINT dststride, UINT dstbuffersize, BYTE *dstbuffer) diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 691b1ec..8845e22 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -87,4 +87,16 @@ extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, IUnknown
extern HRESULT UnknownMetadataReader_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) DECLSPEC_HIDDEN;
+extern LONG module_ref DECLSPEC_HIDDEN;
+static inline void lock_module(void) +{
- InterlockedIncrement(&module_ref);
+}
+static inline void unlock_module(void) +{
- InterlockedDecrement(&module_ref);
+}
#endif /* WINCODECS_PRIVATE_H */ diff --git a/dlls/windowscodecs/windowscodecs.spec b/dlls/windowscodecs/windowscodecs.spec index d0b6a7e..71022cb 100644 --- a/dlls/windowscodecs/windowscodecs.spec +++ b/dlls/windowscodecs/windowscodecs.spec @@ -1,3 +1,4 @@ +@ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() --
Best Regards, André Hentschel
Am 10.03.2012 19:01, schrieb Vincent Povirk:
Um, you missed almost much every implementation of a COM interface in the entire dll?
2012/3/10 André Hentschel nerv@dawncrow.de:
Needed for dotNet 4.5 preview
dlls/windowscodecs/clsfactory.c | 15 +++++++++++++-- dlls/windowscodecs/main.c | 9 +++++++++ dlls/windowscodecs/wincodecs_private.h | 12 ++++++++++++ dlls/windowscodecs/windowscodecs.spec | 1 + 4 files changed, 35 insertions(+), 2 deletions(-)
Um, i thought that all goes through the factory... So what do you think, should i go through interfaces or is a stub better for now?
Um, i thought that all goes through the factory...
That is incorrect in this case. Windowscodecs has several exports that create COM objects. Even when they do go through the class factory, the other COM objects can and usually do outlive the factory.
So what do you think, should i go through interfaces or is a stub better for now?
A stub returning S_FALSE should be fine.