📄 cregistry.cpp
字号:
/*
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 + -