正在创建与注册表同名的文件
Creating a file with the same name as registry
我想创建一个与注册表同名的文本文件。
比方说,我得到变量valueName,我希望它的值是C:\中.txt文件的名称,我该怎么做?
几乎是最后的代码:
void EnumerateValues(HKEY hKey, DWORD numValues)
{
for (DWORD dwIndex = 0; dwIndex < numValues; dwIndex++)
{BOOL bErrorFlag = FALSE;
char valueName[64];
DWORD valNameLen = sizeof(valueName);
DWORD dataType;
DWORD dataSize = 0;
DWORD retval = RegEnumValue(hKey, dwIndex, valueName, &valNameLen,
NULL, &dataType, NULL, &dataSize);
if (retval == ERROR_SUCCESS)
{//pregatesc calea
char* val = new char[strlen(valueName)];
sprintf(val, "C:\%s.txt", valueName);
printf("S-a creat fisierul: %sn", val);
//creez/suprascriu fisierul
HANDLE hFile;
hFile=CreateFile(val,GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ,
NULL, CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{ printf("Eroare la creat fisierul %s!n",val);
}
//sciru in fisier
char str[] = "Example text testing WriteFile";
DWORD bytesWritten=0;
DWORD dwBytesToWrite = (DWORD)strlen(str);
bErrorFlag=WriteFile(hFile, str, dwBytesToWrite, &bytesWritten, NULL);
if (FALSE == bErrorFlag)
{
printf("Eroare la scriere in fisiern");
}
//inchid fisierul
CloseHandle(hFile);
}
//eroare regenumv
else printf("nError RegEnumValue");
}
}
根本问题是您似乎想要将注册表项HKEY
转换为路径。没有API可以做到这一点。您需要跟踪路径,并将其与HKEY
一起传递给问题中的函数。
您正在将未初始化的值传递给RegEnumValue
,特别是dataSize
。既然你不关心数据,就不要要求它。为数据指针传递NULL
,为数据大小传递零。
您对new
的调用没有分配足够的内存。您需要为目录名、文件扩展名和null终止符留出空间。
由于您完全忽视错误检查,这些问题更加严重。这听起来可能很刺耳,但坦率地说,你需要一些休克治疗。为了能够正常地失败,您需要检查错误。更紧迫的是,为了能够调试代码,您需要检查错误。
您已经标记了代码C++,但写起来就像C一样。如果您真的在使用C++,那么您可以使用标准容器std::string
,以避免原始内存分配和结果泄漏。是的,你现在的代码泄漏。
首先,你的程序比C++更像C,但如果你想在C++中解决这个问题,你可以通过以下方式使用字符串流:
std::stringstream stream;
stream << "C:\";
stream << valueName;
stream << ".txt";
std::string filename(stream.str());
HANDLE hFile=CreateFile(filename.c_str() ,GENERIC_READ,FILE_SHARE_READ,
NULL, CREATE_NEW , FILE_ATTRIBUTE_NORMAL,NULL);
您还需要一个包含:
#include <sstream>
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 检查注册表项是否链接到(或副本)另一个注册表项
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- 注册表正在设置 1 个字符
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 在 c++ 中编辑注册表项
- 某些进程的注册表限制
- 在编译时生成某种子类/类型注册表?
- C 检索可执行文件的图标,用于Windows注册表图标路径
- Qt将Windows注册表导出到文件
- 尝试使用窗口注册表中的路径和 DeleteFile() 方法删除.exe文件
- 正在创建与注册表同名的文件
- C++将.reg文件提取到注册表
- 从文件导入注册表
- 训练sapi:创建转录的wav文件并将文件路径添加到注册表
- 获取COM-Object的dll文件,而不使用c++中的CLSID和注册表
- 如何在c++builder中将注册表导出到*.reg文件
- 最准确和正确的方式来比较两个大的windows 8.1注册表文件(c++ / c#或任何其他)
- 在系统启动时从注册表读取文件[c++]