Не читает значение ProcessorNameString из реестра

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by maked0n, 2 Nov 2011.

  1. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Доброго времени суток! Суть проблемы вот в чем: мне необходимо из реестра вытащить имя процессора. Вот мой код:
    Code:
    	HKEY hKey;
    	res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);
    	if(res != ERROR_SUCCESS)
    		cout << "RegOpenKeyEx() failed with code " << res << endl;
    	res2 = RegQueryValue(hKey, "ProcessorNameString", proc, (long*)1024);
    	if(res2 != ERROR_SUCCESS)
    		cout << "RegQueryValue() failed with code " << res2 << endl;
    
    так вот при таком раскладе оно пишет мне
    RegQueryValue() failed with code 2.
    однако я точно знаю что поле ProcessorNameString у меня есть. пробовал дебагить и обнаружил одну странную вещь(хотя может так и должно быть :confused: ): когда навожу курсор на hKey в ф-ции RegQueryValue, оно мне показывает что
    CXX0030: Error: expression cannot be evaluated.
    я так подозреваю что тут что-то не так. что же я не правильно сделал?
    ЗЫ: в гугле я искал, везде пишут что с указателями проблема при такой ошибке: там память не выделил, там еще что-то. но тут вроде такого нет. :confused: :confused:
     
  2. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,291
    Reputations:
    327
    LONG myBufSiz = 1024;
    RegQueryValue(hKey, "ProcessorNameString", proc, &myBufSiz);

    lurk more this fuckin MSDN! )
     
  3. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    а чем мой код отличается от Вашего? я же преобразовал 1024 к long*
     
  4. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    maked0n, тем, что последний аргумент, это указатель на данные, а не сами данные.


    В результате, функция не может изменить значение константы и вылетает.
     
  5. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    спасибо за объяснение, однако функция все-равно вылетает с той же ошибкой.
     
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,291
    Reputations:
    327
    в результате функция вызовет access violation при обращении по адресу 1024 ( 0x00000400)

    Code:
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HKEY hk;
    	char buff[512];
    	LONG rc, bsize = 512;
    
    
    	rc = RegOpenKey(HKEY_LOCAL_MACHINE, "Hardware\\DESCRIPTION\\System\\CentralProcessor\\0", &hk);
    
    	if(rc == ERROR_SUCCESS)
    	{
    		RegQueryValueEx(hk, "ProcessorNameString",NULL,NULL,(LPBYTE)buff,(LPDWORD)&bsize);
    		MessageBox(0, buff,0,0);
    	}
    	else
    	{
    		wsprintf(buff, "RegOpenKey excepted with code %08X", rc);
    		MessageBox(0, buff,0,0);
    	}
    
    
    	return 0;
    }
    
    все работает
     
    #6 sn0w, 4 Nov 2011
    Last edited: 4 Nov 2011