2011-06-12 157 views
5

我想獲取應用程序安裝位置的路徑。在註冊表中,有一個條目提供了我的應用程序的路徑,請參閱此屏幕截圖: http://i56.tinypic.com/2ly1l6s.jpg從註冊表中讀取值C++

我想讀取我的應用程序所在的路徑。換句話說,我想要C:\ Projects \ MyApplication \ MyApplication.exe部分。這是我想要做的:

HKEY hKey; 
wchar_t mydata[2048]; 
DWORD dataLength = sizeof(mydata); 
DWORD dwType = REG_SZ; 
LPVOID messagecaliss; 
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, KEY_QUERY_VALUE, &hKey); 
GetLastError(); 
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
     NULL, GetLastError(), NULL,(LPTSTR) &messagecaliss, 0, NULL); 
if (regOpenCriss == ERROR_SUCCESS) { 
RegQueryValueEx(HKEY_CURRENT_USER, "TestApplication", 0, &dwType, (BYTE*)mydata, &dataLength); 
wprintf(L"%s\n", mydata); 
system("PAUSE"); 
} 
else 
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION); 

這不起作用,垃圾字符被打印。非常感謝你。

+0

指定您使用的編譯器/開發工具可能很有用。 – vsz 2011-06-12 21:57:26

+0

我使用Visual Studio C++ 2010,Windows 7 – 2011-06-12 22:05:25

+0

來自argv []的路徑有什麼問題? – Andrei 2011-06-12 22:21:11

回答

5

您正在使用非UNICODE版本o RegQueryValueEx,並且您正在使用寬字符版本的printf進行擴展。無論是使用printf或者改變wprintf(L 「%S」,MYDATA)

注:的RegQueryValueEx(HKEY_CURRENT_USER,...)必須的RegQueryValueEx(的hKey,...)

+0

printf什麼都不打印 – 2011-06-12 22:26:15

+0

您查詢的值是否存在?如果是這樣,請檢查RegQueryValueEx的返回值。 – 2011-06-12 22:32:22

+0

並檢查dwType是否已設置爲[REG_SZ](http://msdn.microsoft.com/en-us/library/ms724884(v = VS.85).aspx)。 – 2011-06-12 22:50:09

1

我之後得到的結果:

  1. 我周圍的琴絃用_T()
  2. 我叫RegQueryValueExhKey作爲第一個參數

你應該存儲結果的RegQueryValueEx在一個變量中,並檢查它。處理失敗案例...

0

您提供的代碼的主要問題是您有C風格演員。每個演員陣容都是一個臭蟲吸引器。事實上,你的一些演員是bug(隱藏你使用不兼容的字符類型)。

我想讀取我的應用程序所在的路徑。

使用GetModuleFileName

MSDN docs
獲取完全合格的路徑

乾杯&心連心,

+0

啊,我討厭荷爾蒙的孩子。爲什麼上帝不給他們思想? – 2011-06-12 23:21:14

+0

我不是downvoter,但我認爲OP是要求安裝一些「其他」應用程序,而不是當前正在運行的應用程序。所以GetModuleFileName將無濟於事。 – 2011-06-12 23:59:28

+0

@Guy:他確實寫了「我的申請」,而不是「其他申請」。但很有可能你是對的,他正在想別的東西,而不是他實際上要求的。註冊表代碼指向那個方向,是的 - 但另一方面,也指向不知道「GetModuleFileName」的方向... ;-) – 2011-06-13 00:02:23

1

這不起作用

你怎麼知道沒有。檢查返回值RegQueryValueEx

垃圾字符打印

號這不是垃圾。你沒有要求一個寬字符串,所以你不能指望得到一個。使用Unicode編譯並啓用RegQueryValueExL"TestApplication"_T("TestApplication")TEXT("TestApplication")RegQueryValueEx只是RegQueryValueExARegQueryValueExW的typedef,具體取決於編譯期間是否定義了Unicode。

非常感謝您

不客氣。

+1

+1來對抗無意識的駕駛者downvoter。 – 2011-06-12 23:24:27

+0

你是最親切的。 ;) – 2012-08-21 09:08:36