2013-04-07 172 views
0

我加入我的程序與啓動:如果註冊表鍵不存在,

TCHAR szPath[MAX_PATH]; 
GetModuleFileName(NULL,szPath,MAX_PATH); 
HKEY newValue; 
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&newValue); 
RegSetValueEx(newValue,"myprogram",0,REG_SZ,(LPBYTE)szPath,sizeof(szPath)); 
RegCloseKey(newValue); 
return 0; 

,我想增加一個檢查,如果鍵不存在,只有創建它。還有其他的東西對我的代碼來說很奇怪我已經檢查了我的密鑰的註冊表,我在數據列中看到了我的應用程序路徑+「...」(在.exe之後),當我雙擊來檢查彈出的數據時,它的罰款,它的.exe不僅沒有.EXE ...

感謝您的幫助:)

+0

可能重複[添加應用程序啓動(註冊表)](http://stackoverflow.com/questions/15913202/add-application-to-startup-registry) – 2013-04-11 09:55:36

回答

1

你寫出來的值是MAX_PATH字節寬,無論這條道路真的有多長。因此,在.exe後面可能有很多非打印字符,這就是爲什麼您會看到「...」。

該文檔說最後一個參數是字符串的字節中的大小,包括空終止符。所以我們需要知道字符串的長度(lstrlen(szPath)),我們需要考慮空終止符(+ 1),我們需要從TCHARs轉換爲字節(sizeof(TCHAR)*)。

const DWORD cbData = sizeof(TCHAR) * (lstrlen(szPath) + 1); 
RegSetValueEx(newValue, "myprogram", 0, REG_SZ, (LPBYTE)szPath, cbData); 

該API容易出錯,應該小心使用以避免無意的截斷或緩衝區溢出。 (事實上​​,你需要這些強制轉換來編譯它應該讓你非常謹慎)。許多指向字符串指針的Windows函數需要字符長度(可能不是字節),或者他們計算出終結點的長度。這一個不做這些事情。

+0

謝謝我沒有意識到這一點,它看起來很奇怪,這裏是我的完整代碼你認爲它是什麼?它是否安全使用?http://pastebin.com/a3Bmf67H – 2013-04-09 22:13:41

+0

更新:它似乎並沒有工作在這裏是我的完整代碼:http://pastebin.com/aF2rdADh沒有添加到註冊處 – 2013-04-10 19:06:33

0

您可以使用RegCreateKeyEx()創建一個新的密鑰或打開現有的密鑰。

您在RegEdit中看到的「...」是因爲列不夠寬 - 雙擊列標題末尾以調整列的大小。

+0

這是奇怪的事情......即使在我使其更寬。請你可以編輯我的代碼?我是新來的C不知道該怎麼做...... :( – 2013-04-09 20:36:23

1

您可以檢查註冊表函數輸出....

在這裏,我給你可以使用它的想法...

bool function() 
{ 
    HKEY hKey; 
    LPCTSTR subKey; 
    LPCTSTR subValue; 
    HKEY resKey; 
    DWORD dataLen; 
    hKey = HKEY_LOCAL_MACHINE; 
    subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; 

    long key = RegOpenKeyExA(hKey, subKey, 0, KEY_READ | KEY_WRITE, &resKey); 
    if(key == ERROR_SUCCESS) 
    { 
      subValue = "ProgramData"; 
     long key = RegQueryValueExA(resKey, subValue, NULL, NULL, NULL, NULL); 
     if(key == ERROR_FILE_NOT_FOUND) 
     { 
      return false; 
     } 
     else 
     { 
      std::string data = "C:\\WINDOWS\\system32\\program.exe"; 
      DWORD dataLen = data.size()+1; 

      long key = RegSetValueExA(resKey, subValue, 0, REG_SZ, (const BYTE*)data.c_str(), dataLen); 
      if(key == ERROR_SUCCESS) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

你能證實我編輯它正確嗎?新的C :)它似乎沒有工作:(http://pastebin.com/QEiTKfMC什麼是正確的方式來調用它只是把它放在我的int main?謝謝! – 2013-04-09 20:40:35

+0

錯誤是:error'data'undeclared – 2013-04-10 19:28:34