如果注册表项不存在

时间:2013-04-07 22:58:04

标签: c++ c registry

我正在添加我的程序以启动:

TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL,szPath,MAX_PATH);
HKEY newValue;
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&newValue);
RegSetValueEx(newValue,"myprogram",0,REG_SZ,(LPBYTE)szPath,sizeof(szPath));
RegCloseKey(newValue);
return 0;

我想添加一个检查是否密钥不存在才创建它。我的代码检查注册表中的密码,我在应用程序路径中看到了我的应用程序路径+“...”(在.exe之后),当我双击检查弹出窗口打开的数据时它没关系.exe只有.exe ...

谢谢你的帮助:)

4 个答案:

答案 0 :(得分:1)

你可以检查注册表功能输出....

我在这里给出你可以使用它的想法......

bool function()
{ 
    HKEY hKey;
    LPCTSTR subKey;
    LPCTSTR subValue;
    HKEY resKey;
    DWORD dataLen;
    hKey = HKEY_LOCAL_MACHINE;
    subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

    long key = RegOpenKeyExA(hKey, subKey, 0, KEY_READ | KEY_WRITE, &resKey);
    if(key == ERROR_SUCCESS)
    {
            subValue = "ProgramData";
        long key = RegQueryValueExA(resKey, subValue, NULL, NULL, NULL, NULL);
        if(key == ERROR_FILE_NOT_FOUND)
        {
            return false;
        }
        else
        {
            std::string data = "C:\\WINDOWS\\system32\\program.exe";
            DWORD dataLen = data.size()+1;

            long key = RegSetValueExA(resKey, subValue, 0, REG_SZ, (const BYTE*)data.c_str(), dataLen);
            if(key == ERROR_SUCCESS)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }
}

答案 1 :(得分:1)

您写出的值是MAX_PATH字节宽,无论路径到底有多长。因此,你可能在.exe之后有很多非打印字符,这就是你看到“...”的原因。

文档说最后一个参数是字符串 bytes 的大小,包括空终止符。所以我们需要知道字符串的长度(lstrlen(szPath)),我们需要考虑空终止符(+ 1),我们需要从TCHAR转换为字节(sizeof(TCHAR)*

const DWORD cbData = sizeof(TCHAR) * (lstrlen(szPath) + 1);
RegSetValueEx(newValue, "myprogram", 0, REG_SZ, (LPBYTE)szPath, cbData);

此API容易出错,应谨慎使用,以避免意外截断或缓冲区溢出。 (你需要那些强制转换才能使它编译的事实应该让你非常谨慎。)许多指向字符串指针的Windows函数需要字符长度(可能不是字节)或者它们从终止中找出长度。这个没有做到这两件事。

答案 2 :(得分:0)

您可以使用RegCreateKeyEx()创建新密钥或打开现有密钥。

您在RegEdit中看到的“...”是因为列不够宽 - 双击列标题末尾以调整列的大小。

答案 3 :(得分:0)

我建议在MSDN中建议:您应该使用RegEnumKey(Ex)()RegEnumValue()枚举密钥中的子键/值,然后检查密钥是否已列出

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms724861%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724256%28v=vs.85%29.aspx为例。

希望这有帮助。