Module: wine Branch: master Commit: df9ec3c1785b2b9290611a0e712eb4c98fc55caf URL: http://source.winehq.org/git/wine.git/?a=commit;h=df9ec3c1785b2b9290611a0e71...
Author: Piotr Caban piotr@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;