gpt4 book ai didi

c++ - 为什么我的注册表读取程序会失败?

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:38 25 4
gpt4 key购买 nike

Regedit Screenshot 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);}

当我使用“QKSMTPServer3”作为第二个参数调用 RegQueryValueEx 时,输出如下:

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 . . .

这就是我想要的。现在,当我用“Test2”调用 RegQueryValueEx 时,我得到:

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

然后程序崩溃了。有什么想法吗??

非常感谢

最佳答案

  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. 如果涉及 Unicode 字符,此代码将失败。考虑将所有内容切换到 wchar_t
  6. char mydata[2000] = {'\0'}; <-- 为什么 {'\0'} 而不是 ""{}
  7. 您没有对 GetLastError(); 的返回码做任何事情
  8. 如果字符串中没有 \/GetFileNameFromPath 将失败,因为 std::string::find 将返回 string.npos
  9. system("PAUSE"); 确实应该替换为 std::cin.get();

关于c++ - 为什么我的注册表读取程序会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com