Почему моя программа чтения реестра не работает? - PullRequest
1 голос
/ 13 июня 2011

Снимок экрана Regedit http://i54.tinypic.com/3503vi8.jpg

Теперь этот код:

HKEY hKey;
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, KEY_QUERY_VALUE, &hKey);
char mydata[2000] = {'\0'};
DWORD dwType = REG_SZ;
DWORD dataLength = sizeof(mydata);
LPVOID messagecaliss;
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, "Test2", 0, &dwType, (LPBYTE)&mydata, &dataLength); //change the key you want to read
    printf("%s\n", mydata);
    system("PAUSE");
    RegCloseKey(hKey);
}
else
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION);
printf("%s\t\n", mydata);
std::string FullPath(mydata,dataLength-1);
printf("%s\n", FullPath);
std::string FileName = GetFileNameFromPath(mydata);
printf("%s\n", FileName);
system("PAUSE");

Функция GetFilenameFromPath определяется как:

std::string GetFileNameFromPath (std::string str) {
size_t found;
found=str.find_last_of("/\\");
return str.substr(found+1);}

Когда я вызываю RegQueryValueEx с "QKSMTPServer3 "в качестве второго параметра, вот вывод:

C:\Program Files (x86)\QK SMTP Server 3\QKSmtpServer3.exe
Press any key to continue . . .
C:\Program Files (x86)\QK SMTP Server 3\QKSmtpServer3.exe
C:\Program Files (x86)\QK SMTP Server 3\QKSmtpServer3.exe
QKSmtpServer3.exe
Press any key to continue . . .

Что я и хочу.Теперь, когда я вызываю RegQueryValueEx с «Test2», я получаю:

C:\Test.exe
Press any key to continue . . .
C:\Test.exe

, и программа вылетает.Есть идеи, почему ??

Большое спасибо

1 Ответ

1 голос
/ 13 июня 2011
  1. Ваш код не является безопасным для исключений.Если функции-члены std::string выдают std::bad_alloc, вы утечете дескриптор (HKEY).
  2. Проверьте коды возврата ошибок и GetLastError для более конкретной причины сбоя кода.
  3. printf("%s\n", FullPath); не должен компилироваться, тем более запускаться.Вы уверены, что это не printf("%s\n", FullPath.c_str());?
  4. Вместо буфера фиксированного размера вы должны использовать std::vector.Если вы знаете, что вы всегда будете получать имя файла, вы должны использовать MAX_PATH в качестве размера буфера.
  5. Этот код завершается ошибкой, если вообще используются символы Юникода.Попробуйте вместо этого переключить все на wchar_t.
  6. char mydata[2000] = {'\0'}; <- Почему <code>{'\0'} вместо "" или {}?
  7. Вы ничего не делаете скод возврата GetLastError();
  8. Если в строке нет \ или /, GetFileNameFromPath не удастся, потому что std::string::find вернет string.npos.
  9. system("PAUSE"); следует заменить вместо std::cin.get();.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...