2015-08-14 70 views
1

我正在刪除Windows啓動菜單中的一個快捷方式作爲刪除/創建的一部分基於應用程序中的設置自動啓動。QFile :: remove()工作並不起作用

我最初通過安裝創建快捷方式(我正在使用InnoSetup)。問題是我的代碼不會刪除快捷方式。但是,如果自己刪除快捷方式並讓我的代碼創建它,那麼它會將其刪除。但是快捷方式的名稱完全一樣,我甚至在代碼中檢查它是否存在,並且每次都是這樣。我需要做什麼以便在作爲安裝的一部分創建時刪除它?

void SettingsDialog::on_checkBoxAutoStart_clicked() 
{ 
    QSettings settings; 

    QString startupFolder = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/Startup"; 

    QString installPath = settings.value(INSTALL_PATH, "").toString(); 

    // if path is empty, return 
    if (installPath.isEmpty()) 
     return; 

    QString appPath = installPath+ "\\MyApp.exe"; 

    // if the exe doesn't exist for any reason, return 
    if(!QFile(appPath).exists()) 
     return; 

    QString shortcutName = startupFolder + "/MyApp.lnk"; 

    if (ui->checkBoxAutoStart->checkState() == Qt::Checked) 
    { 
     QFile::link(appPath, shortcutName); 

     settings.setValue(AUTO_START, "true"); 
    } 
    else 
    { 

     QFile shortcut(shortcutName); 

     if (!shortcut.exists()) 
      qDebug() << "shortcut don't exist"; 

     int shortcut_permissions = shortcut.permissions(); 

     shortcut.setPermissions(QFile::ReadUser | QFile::WriteUser | QFile::ExeUser | QFile::ExeUser); 

     shortcut_permissions = shortcut.permissions(); 

     shortcut.remove(); 

     qDebug() << shortcut.errorString(); 

     settings.setValue(AUTO_START, "false"); 
    } 

} 

我在Windows 7

更新

它創建快捷方式的INNO-設置線運行,這是這個(我已經改名爲我的應用程序名稱通用)。

[Icons] 
Name: "{commonstartup}\MyApp"; Filename: "{app}\MyApp.exe" 
+0

@KubaOber安裝程序會將其安裝在當前用戶配置文件中。我的系統也擁有管理員權限。這只是將文件複製到程序文件並在開始菜單中創建快捷方式的標準安裝。我會必須有一種方法來刪除應用程序的快捷方式,以便它自動啓動或不啓動,這是非常標準的。 – zar

+0

@KubaOber我已經將inno-setup行添加到OP,它在開始菜單中創建快捷方式。其餘的是非常標準的文件。 – zar

+0

你有記錄錯誤的代碼,但是我沒有看到你的問題中的任何地方,你已經說過它輸出的內容。這將是有用的信息。 –

回答

4

TL; DR問題完全在於你的安裝程序和您的誤解,認爲一個非特權過程(如您的Qt應用程序)可以與通用配置文件的快捷方式等亂七八糟

的安裝程序會將其安裝在當前用戶配置文件中。

這是錯誤的。請參閱here以供參考。

{commonstartup}位置創建的快捷方式適用於所有用戶,只能通過以管理員身份運行的進程修改。

如果您希望爲當前用戶創建快捷方式,請在{userstartup}中創建該快捷方式,然後使用用戶權限運行的進程將能夠對其進行修改。請注意,僅僅因爲你在一個管理帳戶上運行,你的Qt進程是而不是以管理權限運行,除非你強制啓動它,或者除非你設置了它的二進制標誌以使Windows啓動它作爲行政程序。

我會必須有一種方法來刪除應用程序的快捷方式,所以它自動啓動或不,這是非常標準的。

它在Windows 95上是非常標準的。在Windows XP上,它不應該是,但沒有人注意到文檔。由於Vista和UAC的到來,如果啓動快捷方式位於Public帳戶(以前稱爲AllUsers),則無法通過非管理進程完成。

此外,由於您是管理員,因此您可以輕鬆地從資源管理器中刪除或修改該快捷方式,但這是因爲資源管理器以管理功能運行。你的Qt程序沒有。非管理(默認)命令提示符都不會。

相關問題