为什么我的注册表读取程序失败?

如何解决为什么我的注册表读取程序失败?

| Regedit截图http://i54.tinypic.com/3503vi8.jpg 现在,此代码
HKEY hKey;
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER,\"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\\\\\",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(),(LPTSTR) &messagecaliss,NULL );

if (regOpenCriss == ERROR_SUCCESS) {
    RegQueryValueEx(hKey,\"Test2\",&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
程序崩溃。任何想法为什么? 非常感谢你     

解决方法

         您的代码不是异常安全的。如果
std::string
的成员函数抛出
std::bad_alloc
,则将泄漏句柄(the6ѭ)。 检查错误返回码和ѭ7,以获取导致代码失败的更具体原因。
printf(\"%s\\n\",FullPath);
不应该编译,更不用说运行了。您确定不是9英镑吗? 不应使用固定大小的缓冲区,而应使用
std::vector
。如果您知道总会得到一个文件名,则应使用ѭ11作为缓冲区大小。 如果完全涉及Unicode字符,则此代码将失败。考虑将所有内容切换到
wchar_t
char mydata[2000] = {\'\\0\'};
<-为什么
{\'\\0\'}
而不是just15ѭ或
{}
? 您未对返回码
GetLastError();
做任何操作 如果字符串中没有
\\
/
,则
GetFileNameFromPath
将失败,因为fail21ѭ将返回
string.npos
system(\"PAUSE\");
应该真正由
std::cin.get();
代替。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?