Piotr Caban : windowscodecs: Add helper to create internal COM classes without CoCreateInstance call if possible.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 6 06:27:28 CST 2015
Module: wine
Branch: master
Commit: df9ec3c1785b2b9290611a0e712eb4c98fc55caf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=df9ec3c1785b2b9290611a0e712eb4c98fc55caf
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Mar 6 11:20:16 2015 +0100
windowscodecs: Add helper to create internal COM classes without CoCreateInstance call if possible.
---
dlls/windowscodecs/clsfactory.c | 11 +++++++++++
dlls/windowscodecs/info.c | 13 +++++--------
dlls/windowscodecs/tests/gifformat.c | 12 ++++++++++++
dlls/windowscodecs/wincodecs_private.h | 2 ++
4 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c
index 614a5d1..a862338 100644
--- a/dlls/windowscodecs/clsfactory.c
+++ b/dlls/windowscodecs/clsfactory.c
@@ -202,3 +202,14 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
TRACE("<-- %08X\n", ret);
return ret;
}
+
+HRESULT create_instance(CLSID *clsid, const IID *iid, void **ppv)
+{
+ int i;
+
+ for (i=0; wic_classes[i].classid; i++)
+ if (IsEqualCLSID(wic_classes[i].classid, clsid))
+ return wic_classes[i].constructor(iid, ppv);
+
+ return CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, ppv);
+}
diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c
index f532ad1..2cb64d4 100644
--- a/dlls/windowscodecs/info.c
+++ b/dlls/windowscodecs/info.c
@@ -623,8 +623,7 @@ static HRESULT WINAPI BitmapDecoderInfo_CreateInstance(IWICBitmapDecoderInfo *if
TRACE("(%p,%p)\n", iface, ppIBitmapDecoder);
- return CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IWICBitmapDecoder, (void**)ppIBitmapDecoder);
+ return create_instance(&This->clsid, &IID_IWICBitmapDecoder, (void**)ppIBitmapDecoder);
}
static const IWICBitmapDecoderInfoVtbl BitmapDecoderInfo_Vtbl = {
@@ -917,8 +916,7 @@ static HRESULT WINAPI BitmapEncoderInfo_CreateInstance(IWICBitmapEncoderInfo *if
TRACE("(%p,%p)\n", iface, ppIBitmapEncoder);
- return CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IWICBitmapEncoder, (void**)ppIBitmapEncoder);
+ return create_instance(&This->clsid, &IID_IWICBitmapEncoder, (void**)ppIBitmapEncoder);
}
static const IWICBitmapEncoderInfoVtbl BitmapEncoderInfo_Vtbl = {
@@ -1125,8 +1123,8 @@ static HRESULT WINAPI FormatConverterInfo_CreateInstance(IWICFormatConverterInfo
TRACE("(%p,%p)\n", iface, ppIFormatConverter);
- return CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IWICFormatConverter, (void**)ppIFormatConverter);
+ return create_instance(&This->clsid, &IID_IWICFormatConverter,
+ (void**)ppIFormatConverter);
}
static BOOL ConverterSupportsFormat(IWICFormatConverterInfo *iface, const WCHAR *formatguid)
@@ -1871,8 +1869,7 @@ static HRESULT WINAPI MetadataReaderInfo_CreateInstance(IWICMetadataReaderInfo *
TRACE("(%p,%p)\n", iface, reader);
- return CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IWICMetadataReader, (void **)reader);
+ return create_instance(&This->clsid, &IID_IWICMetadataReader, (void **)reader);
}
static const IWICMetadataReaderInfoVtbl MetadataReaderInfo_Vtbl = {
diff --git a/dlls/windowscodecs/tests/gifformat.c b/dlls/windowscodecs/tests/gifformat.c
index 6924ae8..2925911 100644
--- a/dlls/windowscodecs/tests/gifformat.c
+++ b/dlls/windowscodecs/tests/gifformat.c
@@ -25,6 +25,8 @@
#include "wincodec.h"
#include "wine/test.h"
+HRESULT WINAPI WICCreateImagingFactory_Proxy(UINT, IWICImagingFactory**);
+
static const char gif_global_palette[] = {
/* LSD */'G','I','F','8','7','a',0x01,0x00,0x01,0x00,0xa1,0x02,0x00,
/* palette */0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,
@@ -344,4 +346,14 @@ START_TEST(gifformat)
IWICImagingFactory_Release(factory);
CoUninitialize();
+
+ /* run the same tests with no COM initialization */
+ hr = WICCreateImagingFactory_Proxy(WINCODEC_SDK_VERSION, &factory);
+ ok(hr == S_OK, "WICCreateImagingFactory_Proxy error %#x\n", hr);
+
+ test_global_gif_palette();
+ test_global_gif_palette_2frames();
+ test_local_gif_palette();
+
+ IWICImagingFactory_Release(factory);
}
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h
index f6ac785..a2f3ded 100644
--- a/dlls/windowscodecs/wincodecs_private.h
+++ b/dlls/windowscodecs/wincodecs_private.h
@@ -67,6 +67,8 @@ DECLARE_INTERFACE_(IMILUnknown2,IUnknown)
};
#undef INTERFACE
+HRESULT create_instance(CLSID *clsid, const IID *iid, void **ppv) DECLSPEC_HIDDEN;
+
typedef HRESULT(*class_constructor)(REFIID,void**);
extern HRESULT FormatConverter_CreateInstance(REFIID riid, void** ppv) DECLSPEC_HIDDEN;
extern HRESULT ComponentFactory_CreateInstance(REFIID riid, void** ppv) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list