⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regsvr.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/***********************************************************************
 *		regsvr_key_guid
 */
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
{
    WCHAR buf[39];

    StringFromGUID2(guid, buf, 39);
    return register_key_defvalueW(base, name, buf);
}

/***********************************************************************
 *		regsvr_key_defvalueW
 */
static LONG register_key_defvalueW(
    HKEY base,
    WCHAR const *name,
    WCHAR const *value)
{
    LONG res;
    HKEY key;

    res = RegCreateKeyExW(base, name, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
    if (res != ERROR_SUCCESS) return res;
    res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
			 (lstrlenW(value) + 1) * sizeof(WCHAR));
    RegCloseKey(key);
    return res;
}

/***********************************************************************
 *		regsvr_key_defvalueA
 */
static LONG register_key_defvalueA(
    HKEY base,
    WCHAR const *name,
    char const *value)
{
    LONG res;
    HKEY key;

    res = RegCreateKeyExW(base, name, 0, NULL, 0,
			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
    if (res != ERROR_SUCCESS) return res;
    res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
			 lstrlenA(value) + 1);
    RegCloseKey(key);
    return res;
}

/***********************************************************************
 *		regsvr_progid
 */
static LONG register_progid(
    WCHAR const *clsid,
    char const *progid,
    char const *name)
{
    LONG res;
    HKEY progid_key;

    res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
			  NULL, 0, KEY_READ | KEY_WRITE, NULL,
			  &progid_key, NULL);
    if (res != ERROR_SUCCESS) return res;

    if (name) {
	res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
			     (CONST BYTE*)name, strlen(name) + 1);
	if (res != ERROR_SUCCESS) goto error_close_progid_key;
    }

    if (clsid) {
	res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
	if (res != ERROR_SUCCESS) goto error_close_progid_key;
    }

error_close_progid_key:
    RegCloseKey(progid_key);
    return res;
}

/***********************************************************************
 *		recursive_delete_key
 */
static LONG recursive_delete_key(HKEY key)
{
    LONG res;
    WCHAR subkey_name[MAX_PATH];
    DWORD cName;
    HKEY subkey;

    for (;;) {
	cName = sizeof(subkey_name) / sizeof(WCHAR);
	res = RegEnumKeyExW(key, 0, subkey_name, &cName,
			    NULL, NULL, NULL, NULL);
	if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) {
	    res = ERROR_SUCCESS; /* presumably we're done enumerating */
	    break;
	}
	res = RegOpenKeyExW(key, subkey_name, 0,
			    KEY_READ | KEY_WRITE, &subkey);
	if (res == ERROR_FILE_NOT_FOUND) continue;
	if (res != ERROR_SUCCESS) break;

	res = recursive_delete_key(subkey);
	RegCloseKey(subkey);
	if (res != ERROR_SUCCESS) break;
    }

    if (res == ERROR_SUCCESS) res = RegDeleteKeyW(key, 0);
    return res;
}

/***********************************************************************
 *		recursive_delete_keyA
 */
static LONG recursive_delete_keyA(HKEY base, char const *name)
{
    LONG res;
    HKEY key;

    res = RegOpenKeyExA(base, name, 0, KEY_READ | KEY_WRITE, &key);
    if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS;
    if (res != ERROR_SUCCESS) return res;
    res = recursive_delete_key(key);
    RegCloseKey(key);
    return res;
}

/***********************************************************************
 *		coclass list
 */
static GUID const CLSID_StdOleLink = {
    0x00000300, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };

static GUID const CLSID_PointerMoniker = {
    0x00000306, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };

static GUID const CLSID_PackagerMoniker = {
    0x00000308, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };

extern GUID const CLSID_Picture_Metafile;
extern GUID const CLSID_Picture_Dib;

static struct regsvr_coclass const coclass_list[] = {
    {   &CLSID_StdOleLink,
	"StdOleLink",
	NULL,
	"ole32.dll",
	NULL
    },
    {   &CLSID_FileMoniker,
	"FileMoniker",
	NULL,
	"ole32.dll",
	"Both",
        "file"
    },
    {   &CLSID_ItemMoniker,
	"ItemMoniker",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_AntiMoniker,
	"AntiMoniker",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_PointerMoniker,
	"PointerMoniker",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_PackagerMoniker,
	"PackagerMoniker",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_CompositeMoniker,
	"CompositeMoniker",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_DfMarshal,
	"DfMarshal",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_Picture_Metafile,
	"Picture (Metafile)",
	NULL,
	"ole32.dll",
	NULL,
	"StaticMetafile"
    },
    {   &CLSID_Picture_Dib,
	"Picture (Device Independent Bitmap)",
	NULL,
	"ole32.dll",
	NULL,
	"StaticDib"
    },
    {   &CLSID_ClassMoniker,
	"ClassMoniker",
	NULL,
	"ole32.dll",
	"Both",
        "CLSID"
    },
    {	&CLSID_PSFactoryBuffer,
	"PSFactoryBuffer",
	NULL,
	"ole32.dll",
	"Both"
    },
    {   &CLSID_StdGlobalInterfaceTable,
	"StdGlobalInterfaceTable",
	NULL,
	"ole32.dll",
	"Apartment"
    },
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		interface list
 */

#define INTERFACE_ENTRY(interface, base, clsid32, clsid16) { &IID_##interface, #interface, base, sizeof(interface##Vtbl)/sizeof(void*), clsid16, clsid32 }
#define BAS_INTERFACE_ENTRY(interface, base) INTERFACE_ENTRY(interface, &IID_##base, &CLSID_PSFactoryBuffer, NULL)
#define STD_INTERFACE_ENTRY(interface) INTERFACE_ENTRY(interface, NULL, &CLSID_PSFactoryBuffer, NULL)
#define LCL_INTERFACE_ENTRY(interface) INTERFACE_ENTRY(interface, NULL, NULL, NULL)

static const struct regsvr_interface interface_list[] = {
    LCL_INTERFACE_ENTRY(IUnknown),
    STD_INTERFACE_ENTRY(IClassFactory),
    LCL_INTERFACE_ENTRY(IMalloc),
    LCL_INTERFACE_ENTRY(IMarshal),
    STD_INTERFACE_ENTRY(ILockBytes),
    STD_INTERFACE_ENTRY(IStorage),
    STD_INTERFACE_ENTRY(IStream),
    STD_INTERFACE_ENTRY(IEnumSTATSTG),
    STD_INTERFACE_ENTRY(IBindCtx),
    BAS_INTERFACE_ENTRY(IMoniker, IPersistStream),
    STD_INTERFACE_ENTRY(IRunningObjectTable),
    STD_INTERFACE_ENTRY(IRootStorage),
    LCL_INTERFACE_ENTRY(IMessageFilter),
    LCL_INTERFACE_ENTRY(IStdMarshalInfo),
    LCL_INTERFACE_ENTRY(IExternalConnection),
    LCL_INTERFACE_ENTRY(IMallocSpy),
    LCL_INTERFACE_ENTRY(IMultiQI),
    STD_INTERFACE_ENTRY(IEnumUnknown),
    STD_INTERFACE_ENTRY(IEnumString),
    STD_INTERFACE_ENTRY(IEnumMoniker),
    STD_INTERFACE_ENTRY(IEnumFORMATETC),
    STD_INTERFACE_ENTRY(IEnumOLEVERB),
    STD_INTERFACE_ENTRY(IEnumSTATDATA),
    BAS_INTERFACE_ENTRY(IPersistStream, IPersist),
    BAS_INTERFACE_ENTRY(IPersistStorage, IPersist),
    BAS_INTERFACE_ENTRY(IPersistFile, IPersist),
    STD_INTERFACE_ENTRY(IPersist),
    STD_INTERFACE_ENTRY(IViewObject),
    STD_INTERFACE_ENTRY(IDataObject),
    STD_INTERFACE_ENTRY(IAdviseSink),
    LCL_INTERFACE_ENTRY(IDataAdviseHolder),
    LCL_INTERFACE_ENTRY(IOleAdviseHolder),
    STD_INTERFACE_ENTRY(IOleObject),
    BAS_INTERFACE_ENTRY(IOleInPlaceObject, IOleWindow),
    STD_INTERFACE_ENTRY(IOleWindow),
    BAS_INTERFACE_ENTRY(IOleInPlaceUIWindow, IOleWindow),
    STD_INTERFACE_ENTRY(IOleInPlaceFrame),
    BAS_INTERFACE_ENTRY(IOleInPlaceActiveObject, IOleWindow),
    STD_INTERFACE_ENTRY(IOleClientSite),
    BAS_INTERFACE_ENTRY(IOleInPlaceSite, IOleWindow),
    STD_INTERFACE_ENTRY(IParseDisplayName),
    BAS_INTERFACE_ENTRY(IOleContainer, IParseDisplayName),
    BAS_INTERFACE_ENTRY(IOleItemContainer, IOleContainer),
    STD_INTERFACE_ENTRY(IOleLink),
    STD_INTERFACE_ENTRY(IOleCache),
    LCL_INTERFACE_ENTRY(IDropSource),
    STD_INTERFACE_ENTRY(IDropTarget),
    BAS_INTERFACE_ENTRY(IAdviseSink2, IAdviseSink),
    STD_INTERFACE_ENTRY(IRunnableObject),
    BAS_INTERFACE_ENTRY(IViewObject2, IViewObject),
    BAS_INTERFACE_ENTRY(IOleCache2, IOleCache),
    STD_INTERFACE_ENTRY(IOleCacheControl),
    STD_INTERFACE_ENTRY(IRemUnknown),
    LCL_INTERFACE_ENTRY(IClientSecurity),
    LCL_INTERFACE_ENTRY(IServerSecurity),
    STD_INTERFACE_ENTRY(ISequentialStream),
    { NULL }			/* list terminator */
};

/***********************************************************************
 *		DllRegisterServer (OLE32.@)
 */
HRESULT WINAPI DllRegisterServer(void)
{
    HRESULT hr;

    TRACE("\n");

    hr = register_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = register_interfaces(interface_list);
    return hr;
}

/***********************************************************************
 *		DllUnregisterServer (OLE32.@)
 */
HRESULT WINAPI DllUnregisterServer(void)
{
    HRESULT hr;

    TRACE("\n");

    hr = unregister_coclasses(coclass_list);
    if (SUCCEEDED(hr))
	hr = unregister_interfaces(interface_list);
    return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -