正在创建与注册表同名的文件

Creating a file with the same name as registry

本文关键字:文件 注册表 创建      更新时间:2023-10-16

我想创建一个与注册表同名的文本文件。

比方说,我得到变量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>