qt自启动设置,qt创建快捷方式和qt修改注册表,windows环境

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版权协议,转载请附上原文出处链接和本声明。