我正在添加我的程序以启动:
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 ...
谢谢你的帮助:)
答案 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为例。
希望这有帮助。