windows环境,QT开发的程序设置开机自启动,需要注意,以下修改注册表的操作均需要以管理员身份运行,在qt开发阶段也需要以管理员身份运行qt。
1、添加自启动快捷方式
推荐把可执行程序快捷方式拷贝到当前用户启动目录下:
系统启动目录:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
当前用户启动目录:C:\Users\chw\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
代码实现,添加桌面快捷方式和自启动快捷方式
void Instance::shortcut()
{
QString strAppPath = QCoreApplication::applicationFilePath();//要创建快捷方式的应用程序绝对路径
QFile fApp(strAppPath);
//创建桌面快捷方式
QString strDesktopLink = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/";
strDesktopLink += QCoreApplication::applicationName() + ".lnk";
QFileInfo dir0(strDesktopLink);
if (!dir0.isFile())
{
fApp.link(strDesktopLink);
}
//创建开机启动快捷方式
QString strMenuLink = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/";
strMenuLink += "Startup/";
QDir pathDir;
pathDir.mkpath(strMenuLink);
strMenuLink += QCoreApplication::applicationName() + ".lnk";
//判断是否已存在
QFileInfo dir(strMenuLink);
if (!dir.isFile())
{
fApp.link(strMenuLink);
}
}
2、修改注册表设置开机自启动
以下是修改注册表的方式,在任务管理器可以看到启动项,但这种方式比较繁琐
void Instance::appAutoRun(bool bAutoRun)
{
QSettings reg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);
if (bAutoRun)
{
QString strAppPath=QDir::toNativeSeparators(QCoreApplication::applicationFilePath());
reg.setValue("wirtepad",strAppPath);
}
else
{
reg.setValue("wirtepad","");
}
}
修改注册表方式可能会遇到的问题:
问题1,自启动运行失败,提示缺少*.dll
相关dll库已经放在程序所在文件夹,直接双击是可以启动的,但自启动却提示缺少dll;
原因分析,开机自启动是在cmd命令行运行启动,工作路径是“C:\Windows\System32”,因此不会在程序exe所在路径搜索依赖库;
最直接的方式是把依赖库拷贝到“C:\Windows\System32”目录下;
也可以通过修改注册表,修改环境变量:
1、以qt的方式修改注册表
void Instance::addENV_qt()
{
QSettings reg("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment",QSettings::NativeFormat);
QString path = reg.value("Path").toString();
QString newpath = QCoreApplication::applicationDirPath().replace("/","\\");
QStringList pathList = path.split(";");
bool bSameFlag = false;
foreach(QString item,pathList)
{
if(item == newpath)
bSameFlag = true;
}
if(!bSameFlag)
{
path += ";" + newpath;
reg.setValue("path",path);
}
}
2、C++结合win系统API修改环境变量
#include <windows.h>
#include <stdio.h>
void MainWindow::modENV_win()
{
HKEY hKey;
const char *mysql = ";C:\\mysql\\bin";
const char *key = "System\\CurrentControlSet\\Control\\Session Manager\\Environment";
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, key, 0, KEY_READ|KEY_WRITE, &hKey) != ERROR_SUCCESS)
{
//RegOpenKeyEx Failure!
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" RegOpenKeyEx Failure!";
}
DWORD dwType = REG_SZ;
char data[1024] = {};
DWORD dwSize = sizeof(data);
//获取当前环境变量Path的值
if (RegQueryValueExA(hKey, "Path", NULL, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
{
//RegQueryValueEx Failure!
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" RegQueryValueEx Failure!";
}
char *environment = new char[strlen(mysql) + strlen(data)];
sprintf(environment, "%s%s", data, mysql);
//设置环境变量Path的值
if (RegSetValueExA(hKey, "Path", NULL, REG_SZ, (const unsigned char *)environment, strlen(environment)) != ERROR_SUCCESS)
{
//RegSetValueEx Failure!
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" RegSetValueEx Failure!";
}
RegCloseKey(hKey);
delete[] environment;
environment = nullptr;
}
问题2,依赖的配置文件无法加载
比如程序依赖的配置文件、图片资源等没有正确加载,原因和问题1类似,程序中使用了相对路径,比如"./config/image.png",就会在“C:\Windows\System32”的当前路径下寻找;
解决办法,不要在程序中使用相对路径,使用QCoreApplication::applicationDirPath()获得程序exe所在文件夹的绝对路径。
版权声明:本文为weixin_40355471原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。