我想创建一个与注册表同名的文本文件。
说,我得到变量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: %s\n", 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 fisier\n");
}
//inchid fisierul
CloseHandle(hFile);
}
//eroare regenumv
else printf("\nError RegEnumValue");
}
}
答案 0 :(得分:2)
根本问题是您似乎想要将注册表项HKEY
转换为路径。并且没有API可以做到这一点。您需要跟踪路径并将其与HKEY
一起传递给问题中的函数。
您正在将未初始化的值传递给RegEnumValue
,特别是dataSize
。由于您不关心数据,因此不要求它。传递数据指针NULL
,数据大小传递零。
您对new
的呼叫未分配足够的内存。您需要空间用于目录名称,文件扩展名和空终止符。
您完全忽略错误检查会加剧这些问题。这可能听起来很苛刻,但坦率地说,你需要一些休克治疗。为了能够优雅地失败,您需要检查错误。更迫切的是,为了能够调试代码,您需要检查错误。
您已经标记了代码C ++,但是就好像它是C一样。如果您真的使用C ++,那么您可以使用标准容器std::string
,避免原始内存分配和结果泄漏。是的,您可以根据情况对泄漏进行编码。
答案 1 :(得分:1)
首先你的程序比C ++更像C,但如果你想用C ++解决这个问题,你可以用以下方式使用stringstream:
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>