那100~泪奔[2014/10/16 23:11]
代码通过修改注册表,使程序能够在系统登录时运行。比较了一下不同编码方式下的情况,可以使用差分工具看一下变化。
1. 代码设置的编码为Unicode,注册表中显示的是乱码
// RegEdit.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { wchar_t regname[]=L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEY hkResult; int ret; //TODO 为了方便,进行了强转 const unsigned char * SetValue=(const unsigned char *)"%java_home%\\door.exe"; ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult); //打开关键字 ret=RegSetValueEx(hkResult,L"door",0,REG_SZ,SetValue,sizeof(SetValue)); //设置键值 if(ret==0){ printf("success to write run key \n"); //RegCloseKey(hkResult); } else{ printf("fail to write run key \n"); return 1; } wchar_t modlepath[256]; wchar_t syspath[256]; GetModuleFileName(NULL,modlepath,sizeof(modlepath)); printf("%s",modlepath); //取得程序的名字 GetSystemDirectory(syspath,256); ret=CopyFile(modlepath,(wchar_t *)strcat((char*)syspath,"\\door.exe"),1); if(ret){ printf("%s has been copyed to dir %s \n",modlepath,syspath); } else{ printf("%s is exist",modlepath); } return 0; }
2. 设置ASCII编码,同时简单修改程序代码。
// RegEdit.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEY hkResult; int ret; //TODO 为了方便,进行了强转 const unsigned char * SetValue=(const unsigned char *)"%systemroot%\\RegEdit.exe"; ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult); //打开关键字 //新建了一个环境变量systemroot,值设定为C:\Windows\System32 ret=RegSetValueEx(hkResult,"reg",0,REG_SZ,SetValue,sizeof("%systemroot%\\RegEdit.exe")); //设置键值 if(ret==0){ printf("success to write run key \n"); //RegCloseKey(hkResult); } else{ printf("fail to write run key \n"); return 1; } char modlepath[256]; char syspath[256]; GetModuleFileName(NULL,modlepath,sizeof(modlepath)); printf("%s",modlepath); //取得程序的名字 GetSystemDirectory(syspath,256); ret=CopyFile(modlepath,strcat(syspath,"\\RegEdit.exe"),1); if(ret){ printf("%s has been copyed to dir %s \n",modlepath,syspath); } else{ printf("%s is exist",modlepath); } return 0; }
3.程序运行的效果图
可以看一下注册表中,确实多了程序中的键值。以及Windows/System32目录下的RegEdit.exe文件。程序里有一处写错了,相信大家能发现的。
相关的函数说明:
1.函数原型: DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); 函数参数说明: hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。 lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数 nSize DWORD ,装载到缓冲区lpFileName的最大值 函数返回值: 如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的nSize过小,哪么返回仅按所设置缓冲区大小返回相应字符串内容。 如果函数失败,返回值将为0,并返回GetLastError异常代码。 需要的头文件为: include Windows.h
2. 函数CopyFile原型
BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileName, // pointer to filename to copy to BOOL bFailIfExists // flag for operation if file exists ); 其中各参数的意义: LPCTSTR lpExistingFileName, // 你要拷贝的源文件名 LPCTSTR lpNewFileName, // 你要拷贝的目标文件名 BOOL bFailIfExists // 如果目标已经存在,不拷贝(True)并返回False,覆盖目标(false) //拷贝文件c:\log.txt到d:\log.txt,如果D:\log.txt已经存在,就覆盖 CopyFile("c:\\log.txt","d:\\log.txt",false);
4. 注册表的读操作
// RegRead2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { long lRet; HKEY hKey; TCHAR tchData[64]; DWORD dwSize; //打开注册表 lRet=RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey); if(lRet==ERROR_SUCCESS){ dwSize=sizeof(tchData); lRet=RegQueryValueEx( hKey, "ProcessorNameString", NULL, NULL, (LPBYTE)tchData, &dwSize); if(lRet==ERROR_SUCCESS){ printf("CPU INFO :"); printf("\n%s",tchData); } else{ printf("\n CPU INFO UNKNOWN \n"); } } else{ printf("\n KEY OPEN FAILED \n"); } return 0; }
程序的运行效果图
5. 注册表的写操作
// RegWriter.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { //根键、子键名称和到子键的句柄 HKEY hRoot=HKEY_LOCAL_MACHINE; char *szSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEY hKey; DWORD dwDisposition=REG_OPENED_EXISTING_KEY; //如果不存在就创建 LONG lRet=RegCreateKeyEx( hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(lRet !=ERROR_SUCCESS){ return -1; } //得到当前执行文件的文件名(包含路径) char szModule[MAX_PATH]; GetModuleFileName(NULL,szModule,MAX_PATH); //创建一个新的键值,设置键值数据为文件名 lRet=RegSetValueEx( hKey, "SelfDemo", 0, REG_SZ, (BYTE *)szModule, strlen(szModule)); if(lRet==ERROR_SUCCESS){ printf("self run success \n"); } RegCloseKey(hKey); return 0; }
程序运行的结果:
3.打开一个注册表 LONG WINAPI RegOpenKeyEx( _In_ HKEY hKey, _In_opt_ LPCTSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult ); hKey:可以是以下选项之一 HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey:打开子键的名字,该名字不区分大小写。同时可以为NULL
时间: 2024-07-28 21:26:52