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

📄 cregistry.cpp

📁 VC网络程序设计实例导航配套代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	LPSTR lpszProgram		buffer dove copiare il nome dell'eseguibile associato
	int nSize				dimensione del buffer
*/
BOOL CRegistry::GetProgramForRegisteredFileType(LPCSTR lpcszFileName,LPSTR lpszProgram,int nSize)
{
	char ext[_MAX_EXT+1];
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	DWORD valuesize;
	CRegKey regkey;
		
	// ricava l'estensione del file
	int len = strlen(lpcszFileName)-1;
	for(int i = 0; i < sizeof(ext)+2 && lpcszFileName[len-i]!='.'; i++) // sizeof-2 per '.' e '\0'
		ext[i] = lpcszFileName[len-i];
	ext[i++] = '.';
	ext[i] = '\0';
	strrev(ext);

	// programma associato al tipo file
	memset(lpszProgram,'\0',nSize);

	// ricava l'associazione dal registro
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",ext);

	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)
		{
			_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\shell\\open\\command",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);

					char* p = value;
					while(*p)
					{
						if(*p=='"')
							*p = ' ';
						p++;
					}

					p = value;
					while(*p==' ')
						p++;
					for(i = 0; i < nSize+1; i++)
					{
						if(*p==' ')
							if(strstr(lpszProgram,".exe"))
								break;

						lpszProgram[i] = *p++;
					}
					
					lpszProgram[i] = '\0';
				}
			}
		}
		
		regkey.Close();
	}
	
	regkey.Detach();

	return(lpszProgram[0]!='\0');
}

/*
	ExecuteFileType()

	Esegue l'applicazione associata al tipo file registrato.
	Ricava l'eseguibile relativo al tipo file e lo esegue passandogli come unico parametro
	il nome del file, ignorando gli eventuali parametri/opzioni presenti nel registro.

	LPCSTR lpcszFileName	nome del file (estensione inclusa) per il tipo
*/
BOOL CRegistry::ExecuteFileType(LPCSTR lpcszFileName)
{
	BOOL flag = FALSE;
	char program[_MAX_PATH+1];

	if(GetProgramForRegisteredFileType(lpcszFileName,program,sizeof(program)))
	{
		char cmd[(_MAX_PATH*2)+1] = {0};
		_snprintf(cmd,sizeof(cmd)-1,"%s %s",program,lpcszFileName);
		STARTUPINFO si = {0};
		si.cb = sizeof(STARTUPINFO);
		PROCESS_INFORMATION pi = {0};

		if(::CreateProcess(NULL,cmd,NULL,NULL,FALSE,0L,NULL,NULL,&si,&pi))
		{
			flag = TRUE;
			::CloseHandle(pi.hProcess);
		}
	}

	return(flag);
}

/*
	GetCommandForRegisteredFileType()

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

	LPCSTR lpcszCommand		comando registrato ("open", "print", etc.)
	LPCSTR lpcszFileName	nome del file (estensione inclusa o solo estensione) per il tipo
	LPSTR lpszProgram		buffer dove copiare il nome dell'eseguibile associato
	int nSize				dimensione del buffer
*/
BOOL CRegistry::GetCommandForRegisteredFileType(LPCSTR lpcszCommand,LPCSTR lpcszFileName,LPSTR lpszProgram,int nSize)
{
	char ext[_MAX_EXT+1];
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	DWORD valuesize;
	CRegKey regkey;
		
	// ricava l'estensione del file
	int len = strlen(lpcszFileName)-1;
	for(int i = 0; i < sizeof(ext)+2 && lpcszFileName[len-i]!='.'; i++) // sizeof-2 per '.' e '\0'
		ext[i] = lpcszFileName[len-i];
	ext[i++] = '.';
	ext[i] = '\0';
	strrev(ext);

	// programma associato al tipo file
	memset(lpszProgram,'\0',nSize);

	// ricava l'associazione dal registro
	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",ext);

	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)
		{
			_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s\\shell\\%s\\command",value,lpcszCommand);
			if(regkey.Open(HKEY_LOCAL_MACHINE,key)==ERROR_SUCCESS)
			{
				memset(value,'\0',sizeof(value));
				valuesize = sizeof(value);
				
				if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
					strcpyn(lpszProgram,value,nSize);
			}
		}
		
		regkey.Close();
	}
	
	regkey.Detach();

	return(lpszProgram[0]!='\0');
}

/*
	ShellFileType()

	Esegue l'applicazione associata al tipo file/comando registrati.
	Ricava l'eseguibile relativo al tipo file e lo esegue passandogli come parametro (cerca il '%1')
	il nome del file, includendo gli eventuali parametri/opzioni presenti nel registro.

	LPCSTR lpcszCommand		comando registrato ("open", "print", etc.)
	LPCSTR lpcszFileName	nome del file (estensione inclusa) per il tipo
*/
BOOL CRegistry::ShellFileType(LPCSTR lpcszCommand,LPCSTR lpcszFileName)
{
	BOOL flag = FALSE;
	char program[_MAX_PATH+1];
	char filename[_MAX_PATH+1];

	strcpyn(filename,lpcszFileName,sizeof(filename));
	if(memcmp(filename,"http://",7)==0 && !stristr(filename,".htm"))
		strcpy(filename,".htm");

	if(GetCommandForRegisteredFileType(lpcszCommand,filename,program,sizeof(program)))
	{
		char cmd[(_MAX_PATH*2)+1] = {0};
		char* ext = strrchr(filename,'.');
		if(!ext)
			ext = "";

//		if(!stristr(filename,".exe") && !stristr(filename,".com"))
		if(stricmp(ext,".exe")!=0 && stricmp(ext,".com")!=0)
		{
			char* p = strstr(program,"%1");

			//$ per media player
			if(!p)
				p = strstr(program,"%L");

			if(p)
			{
				int i = p-program;
				strcpyn(cmd,program,sizeof(cmd));
				cmd[i] = '\0';
				strcat(cmd,lpcszFileName);
				
				p = strstr(program,"%1");
				//$ per media player
				if(!p)
					p = strstr(program,"%L");

				if(*(p+2))
					strcat(cmd+i+strlen(lpcszFileName),p+2);
			}
			else
				_snprintf(cmd,sizeof(cmd)-1,"%s \"%s\"",program,lpcszFileName);

			while((p = strchr(cmd,'%'))!=NULL)
			{
				char buffer[(_MAX_PATH*2)+1] = {0};
				char var[_MAX_PATH+1] = {0};
				char value[_MAX_PATH+1] = {0};
				int i = p-cmd+1;
				for(int n = 0; n < sizeof(var)-2 && cmd[i]; n++,i++)
				{
					if(cmd[i]=='%')
						break;
					var[n] = cmd[i];
				}
				var[n] = '\0';

				if((p = getenv(var))!=NULL)
				{
					strcpyn(value,p,sizeof(value));
				
				strcpyn(buffer,cmd,sizeof(buffer));
				p = strchr(buffer,'%');
				strcpyn(p,value,sizeof(buffer)-(p-buffer));
				p = strchr(cmd,'%');
				strcat(buffer,p+strlen(var)+2);

				strcpyn(cmd,buffer,sizeof(cmd));
				}
				else
					break;
			}
		}
		else
			strcpyn(cmd,filename,sizeof(cmd));

		STARTUPINFO si = {0};
		si.cb = sizeof(STARTUPINFO);
		PROCESS_INFORMATION pi = {0};

		if(::CreateProcess(NULL,cmd,NULL,NULL,FALSE,0L,NULL,NULL,&si,&pi))
		{
			flag = TRUE;
			::CloseHandle(pi.hProcess);
		}
	}

	return(flag);
}

/*
	GetContentTypeExtension()
*/
LPSTR CRegistry::GetContentTypeExtension(LPCSTR lpcszContentType,LPSTR lpszExt,UINT nExtSize)
{
	char* p = NULL;
	char key[REGKEY_MAX_KEY_NAME+1];
	char value[REGKEY_MAX_KEY_VALUE+1];
	DWORD valuesize;
	CRegKey regkey;
		
	memset(lpszExt,'\0',nExtSize);

	_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\MIME\\Database\\Content Type\\%s",lpcszContentType);

	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,"Extension",&valuesize)==ERROR_SUCCESS)
		{
			strcpyn(lpszExt,value,nExtSize);
			p = lpszExt;
		}

		regkey.Close();
	}
	
	regkey.Detach();

	return(p);
}

/*
	AddMenuEntryForRegisteredFileType()

	Aggiunge l'entrata al menu contestuale della shell per il tipo file registrato.

	LPCSTR lpcszExtension	estensione del tipo (punto incluso)
	LPCSTR lpcszMenuText	testo per il menu contestuale della shell
	LPCSTR lpcszCommand		comando da associare all'entrata del menu (specificare gli
						eventuali parametri, ad es. '%1', ed opzioni
*/
BOOL CRegistry::AddMenuEntryForRegisteredFileType(LPCSTR lpcszExtension,LPCSTR lpcszMenuText,LPCSTR lpcszCommand)
{
	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);
	
	// 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));
		DWORD valuesize = sizeof(value);
		if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
		{
			regkey.Close();

			// apre la chiave per il nome relativo all'estensione
			// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\gzwfile
			_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",value);
			if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))==ERROR_SUCCESS)
			{
				// 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\\%s\\command",value,lpcszMenuText);
				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",lpcszCommand);
					regkey.SetValue(value,"");
					regkey.Close();
				}
				else
					flag = FALSE;
			}
			else
				flag = FALSE;
		}
	}

	regkey.Detach();

	return(flag);
}

/*
	RemoveMenuEntryForRegisteredFileType()

	Elimina l'entrata dal menu contestuale della shell per il tipo file registrato.

	LPCSTR lpcszExtension	estensione del tipo (punto incluso)
	LPCSTR lpcszMenuText	testo per il menu contestuale della shell
*/
BOOL CRegistry::RemoveMenuEntryForRegisteredFileType(LPCSTR lpcszExtension,LPCSTR lpcszMenuText)
{
	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);
	
	// 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));
		DWORD valuesize = sizeof(value);
		if(regkey.QueryValue(value,"",&valuesize)==ERROR_SUCCESS)
		{
			regkey.Close();

			// apre la chiave per il nome relativo all'estensione
			// es. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\gzwfile
			_snprintf(key,sizeof(key)-1,"SOFTWARE\\Classes\\%s",value);
			if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))==ERROR_SUCCESS)
			{
				// 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",value);
				if((reg = regkey.Open(HKEY_LOCAL_MACHINE,key))==ERROR_SUCCESS)
				{
					regkey.DeleteKey(lpcszMenuText);
					regkey.Close();
				}
				else
					flag = FALSE;
			}
			else
				flag = FALSE;
		}
	}

	regkey.Detach();

	return(flag);
}

⌨️ 快捷键说明

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