创建与注册表同名的文件

时间:2014-03-04 17:08:00

标签: c++ winapi

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

说,我得到变量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");
    }
}

2 个答案:

答案 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>