c++添加开机启动项,win32 api操做注册表,读写注册表

#include<iostream>
#include <windows.h>
#include <sys/types.h>  
#include <sys/stat.h>
#include<string>
using namespace std;
string getFilePathByWindows();
//判断是否为文件  
bool isFile(string path);
//修改或者增长注册表
void createStringReg(HKEY hRoot,char *szSubKey,char* valueName,char *Data);
//添加开机启动到注册表
void addToAuto(string filePath);
//根据文件路径获取文件名称
string getFileNameByFilePath(string filePath);
void show(string str);
void showError();
int main(){
	system("cls");
	cout << "请选择您的操做(1:添加开机启动,2:退出):";
	int choice;	//选择的操做
	cin >> choice;
	
	switch(choice){
	case 1:
		{
			cout << "请输入您的exe路径(能够把exe文件直接拖入):";
			string filePath = getFilePathByWindows();//要添加开机启动的文件路径
			if(filePath == ""){
				cin >> filePath;
			}
			if(!isFile(filePath)){
				cout<<"文件地址无效";
				break;
			}
			addToAuto(filePath);
			show("成功添加到开机启动√");
			main();
		}
		break;
	default:
		break;
	}
	
	return 0;
}
void show(string str){
	//MessageBox(NULL, openFileName.lpstrFile, "", MB_OK);
	MessageBox(NULL, str.c_str(), "", MB_OK);
}
//判断是否为文件  
bool isFile(string path){  
    struct _stat buf = {0};  
    _stat(path.c_str(), &buf);  
    return buf.st_mode & _S_IFREG;  
}  
//打开文件对话框,获取选择的文件
string getFilePathByWindows(){
	char szFileName[MAX_PATH] = {};  
    OPENFILENAMEA openFileName = {};  
    openFileName.lStructSize = sizeof(OPENFILENAMEW);  
    openFileName.nMaxFile = MAX_PATH;//这个必须设置,不设置的话不会出现打开文件对话框    
    openFileName.lpstrFilter = "可执行文件(*.exe*)\0*.exe\0任何文件(*.*)\0*.*\0";  
    openFileName.lpstrFile = szFileName;  
    openFileName.nFilterIndex = 1;  
    openFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;  
  
    if (GetOpenFileName(&openFileName))// 若是保存则用GetSaveFileName()  
    {  
		return openFileName.lpstrFile;
    }
	return "";
}
//添加开机启动到注册表
void addToAuto(string filePath){
	string name = getFileNameByFilePath(filePath);
	createStringReg(HKEY_LOCAL_MACHINE, (char *)"Software\\Microsoft\\Windows\\CurrentVersion\\Run", (char *)name.c_str(), (char *)filePath.c_str());
}

void createStringReg(HKEY hRoot,char *szSubKey,char* valueName,char *Data) 
{ 
    HKEY hKey; 
    //打开注册表键,不存在则建立它 
    long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL); 
    if (lRet!=ERROR_SUCCESS) 
    { 
		show("RegCreateKeyEx error");
        return ; 
    } 

    //修改注册表键值,没有则建立它 
    lRet=RegSetValueEx(hKey,valueName,0,REG_SZ,(BYTE*)Data,strlen(Data)); 
     if (lRet!=ERROR_SUCCESS) 
     { 
         printf("RegSetValueEx error"); 
         return ; 
     } 
    RegCloseKey(hKey); 
} 

//根据文件路径获取文件名称
string getFileNameByFilePath(string filePath){
	int pos = filePath.find_last_of('\\');
	return filePath.substr(pos + 1);
}
void showError()  
{  
    LPVOID lpMsgBuf;  
     FormatMessage(  
     FORMAT_MESSAGE_ALLOCATE_BUFFER  
    |FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,  
     NULL,  
     GetLastError(),  
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language  
     (LPTSTR) &lpMsgBuf,  
     0,  
     NULL  
     );  
     // Process any inserts in lpMsgBuf.  
     // ...  
     // Display the string.  
     MessageBox(NULL,(LPCTSTR)lpMsgBuf, ("Error"), MB_OK | MB_ICONINFORMATION );  
     // Free the buffer.  
     LocalFree( lpMsgBuf );  
}