最近有一个需求,需要向一个没有可视化界面的终端发送网络指令,但是第一要确保在这个终端中,我们的程序是在运行着的,所以需要让他开机自启动。于是,我开始查资料,找到了Sharon Liu的C++设置程序开机自启动以及qq2669573897的VS2017 C++ 编写一个通过注册表自定义软件开机启动程序这篇文章。
但是这两篇文章都不是很完善,Liu的这篇在应用路径的配置上写的很好,但是他引入了一个dxir::Base的类,就是为了处理字符串,但是感觉没有必要,所以在这里使用了第二篇文章中的TEXT(“AppName”)的方式来处理,用起来会方便一些。下面附上综合后的代码。
int AutoStart()
{ //1、配置并打开注册表
//_T宏可以把一个引号引起来的字符串,根你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
LPCTSTR lpSubKey = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
HKEY hKey;
REGSAM flag = KEY_WOW64_64KEY;//当前系统为win7 64位,访问的是64位的注册表,如果访问32位,则改为KEY_WOW64_32KEY
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_ALL_ACCESS | flag, &hKey);
if (ERROR_SUCCESS != lRet)
{
cout << "RegOpenKeyEx fail!" << endl;
return -1;
}
//2、得到本程序自身的全路径
TCHAR strExeFullDir[MAX_PATH];
GetModuleFileName(NULL, strExeFullDir, MAX_PATH);
//3、判断注册表项是否已经存在
TCHAR strDir[MAX_PATH] = {};
DWORD nLength = MAX_PATH;
long result = RegGetValue(hKey, nullptr, TEXT("AppName"), RRF_RT_REG_SZ, 0, strDir, &nLength);
//4、不存在
if (result != ERROR_SUCCESS || _tcscmp(strExeFullDir, strDir) != 0)
{
//5、添加一个子Key,并设置值
lRet = RegSetValueEx(hKey, TEXT("AppName"), 0, REG_SZ, (LPBYTE)strExeFullDir,
(lstrlen(strExeFullDir) + 1) * sizeof(TCHAR));
}
if (ERROR_SUCCESS != lRet)
{
cout << "RegSetValueEx fail!" << endl;
return -1;
}
//6、关闭注册表
RegCloseKey(hKey);
return 0;
}
在主程序中运行后按住Win+R输入regedit,进入计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun,结果如下图。

—————————————————————————————————————
-The End-
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END



















暂无评论内容