// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Defines a map for adding variables to rgs files. This allows COM object // classes to declare the values of these variables so that we don't need to // copy/paste them and manually keep them in sync. // To use this, declare the registry ID of your RGS file using // the DECLARE_REGISTRY_RESOURCEID_EX macro, instead of the // DECLARE_REGISTRY_RESOURCEID, then add a registry map to your class // using the registry map macros: // BEGIN_REGISTRY_MAP(MyClassName) // REGMAP_ENTRY("NAME", "MyClassName Class") // REGMAP_ENTRY_UUID("CLSID", CLSID_MyClassName) // END_REGISTRY_MAP() // // You can then refer to the names above in your RGS file as // variables %NAME% and %CLSID%, respectively. #ifndef BASE_WIN_RGS_HELPER_H_ #define BASE_WIN_RGS_HELPER_H_ #include "base/string_util.h" struct ATLRegmapEntryHelper : public _ATL_REGMAP_ENTRY { ATLRegmapEntryHelper() { szKey = NULL; szData = NULL; } ATLRegmapEntryHelper(LPCOLESTR key, LPCOLESTR data) { szKey = key; size_t size = lstrlen(data) + 1; szData = new wchar_t[size]; base::wcslcpy(const_cast(szData), data, size); } ATLRegmapEntryHelper(LPCOLESTR key, UINT resid) { wchar_t data[256] = {0}; szKey = key; if (::LoadString(_pModule->m_hInstResource, resid, data, arraysize(data) - 1) == 0) { *data = L'\0'; } size_t size = lstrlen(data) + 1; szData = new wchar_t[size]; base::wcslcpy(const_cast(szData), data, size); } ATLRegmapEntryHelper(LPCOLESTR key, REFGUID guid) { szKey = key; static const size_t kGuidStringSize = 40; szData = new wchar_t[kGuidStringSize]; if (szData) { if (::StringFromGUID2(guid, const_cast(szData), kGuidStringSize) == 0) { *const_cast(szData) = L'\0'; } } } ~ATLRegmapEntryHelper() { delete [] szData; } }; #define BEGIN_REGISTRY_MAP(x)\ static struct _ATL_REGMAP_ENTRY *_GetRegistryMap() {\ static const ATLRegmapEntryHelper map[] = { #define REGMAP_ENTRY(x, y) ATLRegmapEntryHelper(OLESTR(##x), OLESTR(##y)), #define REGMAP_UUID(x, clsid) ATLRegmapEntryHelper(OLESTR(##x), clsid), // This allows usage of a Resource string. #define REGMAP_RESOURCE(x, resid) ATLRegmapEntryHelper(OLESTR(##x), resid), // This allows usage of a static function to be called to provide the string. #define REGMAP_FUNCTION(x, f) ATLRegmapEntryHelper(OLESTR(##x), ##f()), #define END_REGISTRY_MAP() ATLRegmapEntryHelper() };\ return (_ATL_REGMAP_ENTRY*)map;\ } #define DECLARE_REGISTRY_RESOURCEID_EX(x)\ static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {\ return ATL::_pAtlModule->UpdateRegistryFromResource((UINT)x, bRegister, \ _GetRegistryMap());\ } #endif // BASE_WIN_RGS_HELPER_H_