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