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

📄 cregistry.cpp

📁 VC网络程序设计实例导航配套代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	CRegistry.cpp
	Classe base per l'accesso al registro (SDK/MFC).
	Luca Piergentili, 07/08/00
	lpiergentili@yahoo.com
	http://www.geocities.com/lpiergentili/
*/
#include "env.h"
#include "pragma.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stristr.h"
#include "strcpyn.h"
#include "window.h"
#include "CRegKey.h"
#include "CRegistry.h"

/*
	RegisterFileType()

	Registra il tipo file nel registro.

	LPREGISTERFILETYPE lpRegFileType	ptr alla struttura contenente i dati per la registrazione
*/
BOOL CRegistry::RegisterFileType(LPREGISTERFILETYPE lpRegFileType)
{
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	CRegKey regkey;
	LONG reg;
	BOOL flag = TRUE;
	memset(key,'\0',sizeof(key));

	regkey.Attach(HKEY_LOCAL_MACHINE);
	
	// crea la chiave relativa all'estensione
	// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpRegFileType->extension);
	if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
		reg = regkey.Create(HKEY_LOCAL_MACHINE,key);

	if(reg==ERROR_SUCCESS)
	{
		// imposta il valore di default con il nome relativo
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw -> (Default) = gzwfile
		regkey.SetValue(lpRegFileType->name,"");

		// imposta il tipo mime
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw -> Content Type = application/x-gzw-compressed
		regkey.SetValue(lpRegFileType->contenttype,"Content Type");

		regkey.Close();
	}
	else
		flag = FALSE;

	// crea la chiave per il nome relativo all'estensione
	// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\gzwfile
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpRegFileType->name);
	if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
		reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		
	if(reg==ERROR_SUCCESS)
	{
		// imposta il valore di default con la descrizione del tipo
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile -> (Default) = GZW compressed data
		regkey.SetValue(lpRegFileType->description,"");
		regkey.SetBinaryValue(0x00000000,"EditFlags");

		regkey.Close();

		// crea la chiave per l'icona di default
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\DefaultIcon
		_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\DefaultIcon",lpRegFileType->name);
		if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
			reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		if(reg==ERROR_SUCCESS)
		{
			// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\DefaultIcon -> c:\bin\gzwshell.exe,0
			_snprintf(value,sizeof(key)-1,"%s,%d",lpRegFileType->shell,lpRegFileType->defaulticon);
			regkey.SetValue(value,"");

			regkey.Close();
		}
		else
			flag = FALSE;

		// crea la chiave per l'apertura del file tramite la shell
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\shell\open\command
		_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\shell\\open",lpRegFileType->name);
		if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
			reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		if(reg==ERROR_SUCCESS)
		{
			regkey.SetBinaryValue(0x00000001,"EditFlags");
			regkey.Close();
		}
		else
			flag = FALSE;
		
		_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\shell\\open\\command",lpRegFileType->name);
		if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
			reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		if(reg==ERROR_SUCCESS)
		{
			// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\shell\open\command -> c:\bin\gzwshell.exe
			_snprintf(value,sizeof(key)-1,"%s %s",lpRegFileType->shell,lpRegFileType->shellopenargs);
			regkey.SetValue(value,"");
			regkey.Close();
		}
		else
			flag = FALSE;
	}
	else
		flag = FALSE;

	regkey.Detach();

	return(flag);
}

/*
	UnregisterFileType()

	Elimina la registrazione per il tipo dal registro.

	LPCSTR lpcszExtension	estensione da eliminare (punto incluso)
*/
BOOL CRegistry::UnregisterFileType(LPCSTR lpcszExtension)
{
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	DWORD valuesize;
	CRegKey regkey;
	BOOL flag = FALSE;

	regkey.Attach(HKEY_LOCAL_MACHINE);
	
	// cerca la chiave relativa all'estensione
	// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpcszExtension);
	if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
	{
		// ricava il nome relativo
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw -> (Default) = gzwfile
		memset(value,'\0',sizeof(value));
		valuesize = sizeof(value);
		if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
		{
			regkey.Close();

			flag = TRUE;

			// elimina la chiave relativa all'estensione
			if(regkey.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes")==ERROR_SUCCESS)
			{
				if(flag)
					flag = regkey.DeleteKey(lpcszExtension);
				regkey.Close();
			}

			// elimina la chiave relativa al nome
			if(regkey.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes")==ERROR_SUCCESS)
			{
				if(flag)
					flag = regkey.DeleteKey(value);
				regkey.Close();
			}
		}
	}
	
	regkey.Detach();

	return(flag);
}

/*
	SetIconForRegisteredFileType()

	Imposta l'icona di default per il tipo file registrato.

	LPREGISTERFILETYPE lpRegFileType	ptr alla struttura contenente i dati per la registrazione
*/
BOOL CRegistry::SetIconForRegisteredFileType(LPREGISTERFILETYPE lpRegFileType)
{
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	CRegKey regkey;
	LONG reg;
	BOOL flag = TRUE;

	regkey.Attach(HKEY_LOCAL_MACHINE);
	
	// crea la chiave relativa all'estensione
	// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpRegFileType->extension);
	if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
		reg = regkey.Create(HKEY_LOCAL_MACHINE,key);

	if(reg==ERROR_SUCCESS)
	{
		// imposta il valore di default con il nome relativo
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.gzw -> (Default) = gzwfile
		regkey.SetValue(lpRegFileType->name,"");

		regkey.Close();
	}
	else
		flag = FALSE;

	// crea la chiave per il nome relativo all'estensione
	// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\gzwfile
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpRegFileType->name);
	if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
		reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		
	if(reg==ERROR_SUCCESS)
	{
		// imposta il valore di default con la descrizione del tipo
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile -> (Default) = GZW compressed data
		regkey.SetValue(lpRegFileType->description,"");
		regkey.SetBinaryValue(0x00000000,"EditFlags");

		regkey.Close();

		// crea la chiave per l'icona di default
		// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\DefaultIcon
		_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\DefaultIcon",lpRegFileType->name);
		if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))!=ERROR_SUCCESS)
			reg = regkey.Create(HKEY_LOCAL_MACHINE,key);
		if(reg==ERROR_SUCCESS)
		{
			// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\extfile\DefaultIcon -> c:\bin\gzwshell.exe,0
			_snprintf(value,sizeof(value)-1,"%s,%d",lpRegFileType->shell,lpRegFileType->defaulticon);
			regkey.SetValue(value,"");

			regkey.Close();
		}
		else
			flag = FALSE;
	}
	else
		flag = FALSE;

	regkey.Detach();

	return(flag);
}

/*
	GetIconForRegisteredFileType()

	Ricava l'handle relativo all'icona per il tipo file registrato.

	LPCSTR lpcszExtension	estensione del tipo (punto incluso)
*/
HICON CRegistry::GetIconForRegisteredFileType(LPCSTR lpcszExtension,LPREGISTERFILETYPE pFileType/*=NULL*/)
{
	char program[_MAX_PATH+1];
	char index[5];
	int nIconIndex = 0;
	HICON hIcon = (HICON)NULL;
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	DWORD valuesize;
	CRegKey regkey;

	if(pFileType)
	{
		memset(pFileType,'\0',sizeof(REGISTERFILETYPE));
		strcpyn(pFileType->extension,lpcszExtension,_MAX_EXT+1);
	}

	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",lpcszExtension);

	regkey.Attach(HKEY_LOCAL_MACHINE);
		
	if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
	{
		memset(value,'\0',sizeof(value));
		valuesize = sizeof(value);

		if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
		{
			if(pFileType)
			{
				strcpyn(pFileType->name,value,_MAX_PATH+1);
				
				char content[REGKEY_MAX_KEY_VALUE+1];
				DWORD contentsize;
				memset(content,'\0',sizeof(content));
				contentsize = sizeof(content);
				if(regkey.QueryValue(content,"Content Type",&contentsize)==ERROR_SUCCESS)
					strcpyn(pFileType->contenttype,content,_MAX_PATH+1);

				_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",pFileType->name);
				if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
				{
					memset(content,'\0',sizeof(content));
					contentsize = sizeof(content);
					if(regkey.QueryValue(content,"",&contentsize)==ERROR_SUCCESS)
						strcpyn(pFileType->description,content,_MAX_PATH+1);
				}
				
				_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\shell\\open\\command",pFileType->name);
				if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
				{
					memset(content,'\0',sizeof(content));
					contentsize = sizeof(content);
					if(regkey.QueryValue(content,"",&contentsize)==ERROR_SUCCESS)
						strcpyn(pFileType->shell,content,_MAX_PATH+1);
				}
			}

			// cerca l'entrata "DefaultIcon"
			memset(program,'\0',sizeof(program));
			_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\DefaultIcon",value);
			if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
			{
				memset(value,'\0',sizeof(value));
				valuesize = sizeof(value);
				
				if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
				{
					strlwr(value);
					int i;
					char* p = value;
					for(i = 0; i < sizeof(program)-1 && *p!=','; i++)
					{
						if(*p!=',')
							program[i] = *p;
						
						p++;
					}
					program[i] = '\0';
					while(*p==',' || *p==' ')
						p++;
					for(i = 0; i < sizeof(index)-1 && *p; i++)
						index[i] = *p++;
					index[i] = '\0';
					nIconIndex = atoi(index);
				}
			}
			// entrata "DefaultIcon" non trovata, sicuramente il tipo specifica il nome della classe
			// relativo al CLSID (es. CorelPhotoPaint.Image.6), quindi, dato che non so come cazzo
			// tirare fuori l'icona associata via OLE, cerca il programma associato all'estensione
			// e recupera la prima icona (quella con indice 0)
			else
			{
				GetProgramForRegisteredFileType(lpcszExtension,program,sizeof(program));
			}

			if(program[0]!='\0')
				hIcon = ::ExtractIcon(m_hInstance,program,nIconIndex);
		}
		
		regkey.Close();
	}
	
	regkey.Detach();

	return(hIcon);
}


/*
	GetSafeIconForRegisteredFileType()

	Ricava l'handle relativo all'icona per il tipo file registrato, restituendo l'icona di sistema
	se non trova quella richiesta.

	LPCSTR lpcszExtension	estensione del tipo (punto incluso)
*/
HICON CRegistry::GetSafeIconForRegisteredFileType(LPCSTR lpcszExtension,LPREGISTERFILETYPE pFileType/*=NULL*/)
{
	HICON hIcon;

	if((hIcon = GetIconForRegisteredFileType(lpcszExtension,pFileType))==(HICON)NULL)
		hIcon = ::LoadIcon(NULL,IDI_WINLOGO);

	return(hIcon);
}

/*
	GetSystemIcon()

	Ricava l'handle relativo all'icona di sistema.

	IDI_PREDEFINED_ICON id	id dell'icona
*/
HICON CRegistry::GetSystemIcon(IDI_PREDEFINED_ICON id)
{
	HICON hIcon;

	switch(id)
	{
		case IDI_APPLICATION_ICON:
			hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
			break;
		case IDI_ASTERISK_ICON:
			hIcon = ::LoadIcon(NULL,IDI_ASTERISK);
			break;
		case IDI_EXCLAMATION_ICON:
			hIcon = ::LoadIcon(NULL,IDI_EXCLAMATION);
			break;
		case IDI_HAND_ICON:
			hIcon = ::LoadIcon(NULL,IDI_HAND);
			break;
		case IDI_QUESTION_ICON:
			hIcon = ::LoadIcon(NULL,IDI_QUESTION);
			break;
		case IDI_WINLOGO_ICON:
		default:
			hIcon = ::LoadIcon(NULL,IDI_WINLOGO);
			break;
	}

	return(hIcon);
}

/*
	GetProgramForRegisteredFileType()

	Ricava l'applicazione associata al tipo file registrato.
	Il nome del programma viene restituito eliminando gli eventuali parametri/opzioni presenti nel registro.

	LPCSTR lpcszFileName	nome del file (estensione inclusa o solo estensione) per il tipo

⌨️ 快捷键说明

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