windowscodecs: Add WICImagingCategories registration.

Dmitry Timoshkov dmitry at baikal.ru
Fri Jun 22 01:12:54 CDT 2012


---
 dlls/windowscodecs/regsvr.c | 102 ++++++++++++++++++++++++++++++++++++++++++++
 include/wincodec.idl        |   1 +
 2 files changed, 103 insertions(+)

diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c
index b73b645..a422747 100644
--- a/dlls/windowscodecs/regsvr.c
+++ b/dlls/windowscodecs/regsvr.c
@@ -1788,6 +1788,104 @@ static struct regsvr_pixelformat const pixelformat_list[] = {
     { NULL }			/* list terminator */
 };
 
+struct regsvr_category
+{
+    const CLSID *clsid; /* NULL for end of list */
+};
+
+static const struct regsvr_category category_list[] = {
+    { &CATID_WICBitmapDecoders },
+    { &CATID_WICBitmapEncoders },
+    { &CATID_WICFormatConverters },
+    { &CATID_WICMetadataReader },
+    { &CATID_WICPixelFormats },
+    { NULL }
+};
+
+static HRESULT register_categories(const struct regsvr_category *list)
+{
+    LONG res;
+    WCHAR buf[39];
+    HKEY coclass_key, categories_key, instance_key;
+
+    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+                          KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+    if (res != ERROR_SUCCESS) return HRESULT_FROM_WIN32(res);
+
+    StringFromGUID2(&CLSID_WICImagingCategories, buf, 39);
+    res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+                          KEY_READ | KEY_WRITE, NULL, &categories_key, NULL);
+    if (res != ERROR_SUCCESS)
+    {
+        RegCloseKey(coclass_key);
+        return HRESULT_FROM_WIN32(res);
+    }
+
+    res = RegCreateKeyExW(categories_key, instance_keyname, 0, NULL, 0,
+                          KEY_READ | KEY_WRITE, NULL, &instance_key, NULL);
+
+    for (; res == ERROR_SUCCESS && list->clsid; list++)
+    {
+        HKEY instance_clsid_key;
+
+        StringFromGUID2(list->clsid, buf, 39);
+        res = RegCreateKeyExW(instance_key, buf, 0, NULL, 0,
+                              KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
+        if (res == ERROR_SUCCESS)
+        {
+            res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
+                                 (const BYTE *)buf, 78);
+            RegCloseKey(instance_clsid_key);
+        }
+    }
+
+    RegCloseKey(instance_key);
+    RegCloseKey(categories_key);
+    RegCloseKey(coclass_key);
+
+    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+static HRESULT unregister_categories(const struct regsvr_category *list)
+{
+    LONG res;
+    WCHAR buf[39];
+    HKEY coclass_key, categories_key, instance_key;
+
+    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+                        KEY_READ | KEY_WRITE, &coclass_key);
+    if (res != ERROR_SUCCESS) return HRESULT_FROM_WIN32(res);
+
+    StringFromGUID2(&CLSID_WICImagingCategories, buf, 39);
+    res = RegOpenKeyExW(coclass_key, buf, 0,
+                        KEY_READ | KEY_WRITE, &categories_key);
+    if (res != ERROR_SUCCESS)
+    {
+        if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+        RegCloseKey(coclass_key);
+        return HRESULT_FROM_WIN32(res);
+    }
+
+    res = RegOpenKeyExW(categories_key, instance_keyname, 0,
+                          KEY_READ | KEY_WRITE, &instance_key);
+
+    for (; res == ERROR_SUCCESS && list->clsid; list++)
+    {
+        StringFromGUID2(list->clsid, buf, 39);
+        res = RegDeleteTreeW(instance_key, buf);
+    }
+
+    RegCloseKey(instance_key);
+    RegCloseKey(categories_key);
+
+    StringFromGUID2(&CLSID_WICImagingCategories, buf, 39);
+    res = RegDeleteTreeW(coclass_key, buf);
+
+    RegCloseKey(coclass_key);
+
+    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
 extern HRESULT WINAPI WIC_DllRegisterServer(void) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI WIC_DllUnregisterServer(void) DECLSPEC_HIDDEN;
 
@@ -1799,6 +1897,8 @@ HRESULT WINAPI DllRegisterServer(void)
 
     hr = WIC_DllRegisterServer();
     if (SUCCEEDED(hr))
+        hr = register_categories(category_list);
+    if (SUCCEEDED(hr))
         hr = register_decoders(decoder_list);
     if (SUCCEEDED(hr))
         hr = register_encoders(encoder_list);
@@ -1819,6 +1919,8 @@ HRESULT WINAPI DllUnregisterServer(void)
 
     hr = WIC_DllUnregisterServer();
     if (SUCCEEDED(hr))
+        hr = unregister_categories(category_list);
+    if (SUCCEEDED(hr))
         hr = unregister_decoders(decoder_list);
     if (SUCCEEDED(hr))
         hr = unregister_encoders(encoder_list);
diff --git a/include/wincodec.idl b/include/wincodec.idl
index 82f419c..ab1e490 100644
--- a/include/wincodec.idl
+++ b/include/wincodec.idl
@@ -1001,6 +1001,7 @@ cpp_quote("DEFINE_GUID(GUID_ContainerFormatWmp, 0x57a37caa,0x367a,0x4540,0x91,0x
 
 cpp_quote("DEFINE_GUID(GUID_VendorMicrosoft, 0xf0e749ca,0xedef,0x4589,0xa7,0x3a,0xee,0x0e,0x62,0x6a,0x2a,0x2b);")
 
+cpp_quote("DEFINE_GUID(CLSID_WICImagingCategories, 0xfae3d380,0xfea4,0x4623,0x8c,0x75,0xc6,0xb6,0x11,0x10,0xb6,0x81);")
 cpp_quote("DEFINE_GUID(CATID_WICBitmapDecoders, 0x7ed96837,0x96f0,0x4812,0xb2,0x11,0xf1,0x3c,0x24,0x11,0x7e,0xd3);")
 cpp_quote("DEFINE_GUID(CATID_WICBitmapEncoders, 0xac757296,0x3522,0x4e11,0x98,0x62,0xc1,0x7b,0xe5,0xa1,0x76,0x7e);")
 cpp_quote("DEFINE_GUID(CATID_WICFormatConverters, 0x7835eae8,0xbf14,0x49d1,0x93,0xce,0x53,0x3a,0x40,0x7b,0x22,0x48);")
-- 
1.7.11




More information about the wine-patches mailing list