• 注冊表操作



        那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); //打开keyword ret=RegSetValueEx(hkResult,L"door",0,REG_SZ,SetValue,sizeof(SetValue)); //设置键值 if(ret==0){ printf("success to write run key "); //RegCloseKey(hkResult); } else{ printf("fail to write run key "); 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 ",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);
    
    	//打开keyword
    	//新建了一个环境变量systemroot,值设定为C:WindowsSystem32
    	ret=RegSetValueEx(hkResult,"reg",0,REG_SZ,SetValue,sizeof("%systemroot%\RegEdit.exe"));
    
    	//设置键值
    	if(ret==0){
    		printf("success to write run key 
    ");
    		//RegCloseKey(hkResult);
    	}
    	else{
    		printf("fail to write run key 
    ");
    		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 
    ",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(" %s",tchData); } else{ printf(" CPU INFO UNKNOWN "); } } else{ printf(" KEY OPEN FAILED "); } 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 "); } 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





  • 相关阅读:
    操作datetable 里面查出来的某个字段
    C# 字符串去重 还有 去除最后一位逗号。
    C# .net 调用ERP接口
    视图下拉列表接收控制器传来的值,并选中下拉类表中该值相对应的选项(新手笔记,请各位大神指教)
    MVC5控制器传值的三种方式(ViewData,ViewBag,TempData),刚刚学习MVC5的新手,希望各位大神多多指教
    c++模板之SFINAE
    c++头文件包含问题
    成员函数指针有多态的效果吗?
    emacs基本操作
    在c++中用function与bind实现委托
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5152995.html
Copyright © 2020-2023  润新知