【发布时间】:2013-05-13 21:51:37
【问题描述】:
我有一个将 calc.exe 添加到启动的简单程序:
#include <windows.h>
#include <tchar.h>
int main(){
_tprintf(TEXT("Adding calc.exe to SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run...\n"));
HKEY hRegRunKey;
LPCTSTR lpKeyName = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LPCTSTR lpKeyValue = TEXT("Calculator");
LPCTSTR lpProgram = TEXT("C:\\WINDOWS\\system32\\calc.exe");
DWORD cchProgram = _tcslen(lpProgram);
_tprintf(TEXT("Path: %s. \n"), lpProgram);
_tprintf(TEXT("Length: %d. \n"), cchProgram);
if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, lpKeyName, 0, KEY_SET_VALUE, &hRegRunKey) == ERROR_SUCCESS){
if(RegSetValueEx(hRegRunKey, lpKeyValue, 0, REG_SZ, (const BYTE *)lpProgram, cchProgram * sizeof(TCHAR)) != ERROR_SUCCESS){
_tprintf(TEXT("ERROR: Can't set key value.\n"));
exit(1);
}else{
_tprintf(TEXT("Key has been added sucessfully.\n"));
}
}
Sleep(5000);
RegCloseKey(hRegRunKey);
}
对我来说,c/c++/WIN32API 的世界仍然充满了谜团……所以我没有几个问题。
1.当我定义字符串时,它会自动以 null 终止吗?
LPCTSTR lpProgram = TEXT("C:\\WINDOWS\\system32\\calc.exe");
或者应该这样做:
LPCTSTR lpProgram = TEXT("C:\\WINDOWS\\system32\\calc.exe\0");
2。在我的代码中,RegSetValueEx 的最后一个参数设置为正确的值吗?
来自MSDN - RegSetValueEx function页面:
cbData [in] lpData指向的信息的大小 参数,以字节为单位。如果数据的类型为 REG_SZ、REG_EXPAND_SZ 或 REG_MULTI_SZ, cbData 必须包含终止 null 的大小 一个或多个字符。
cchProgram 设置为 28 个字符没有空终止。在我的系统上(因为我认为是 UNICODE?)cchProgram * sizeof(TCHAR) = 56。
我不应该将它设置为 58 以添加空终止吗?
当我运行这个程序时,如上所述,没有任何修改,我将通过 Modify binary date 检查注册表中的计算器值,我得到:
43 00 3A 00 5C 00 57 00 C.:.\.W.
49 00 4E 00 44 00 4F 00 I.N.D.O.
57 00 53 00 5C 00 73 00 W.S.\.s.
79 00 73 00 74 00 65 00 y.s.t.e.
6D 00 33 00 32 00 5C 00 m.3.2.\.
63 00 61 00 6C 00 63 00 c.a.l.c.
2E 00 65 00 78 00 65 00 ..e.x.e.
00 00 ..
它的 58 个字节包括空终止。我很困惑:/
更新
在计算 cbData 时,通过在字符串长度上加 1 来计算 NULL 字符,得到的结果与不加它完全相同。
cchProgram * sizeof(TCHAR) 生成与 (cchProgram + 1) * sizeof(TCHAR)
相同的数据条目
提供小于字符串长度的值不会添加 NULL 字节并复制给定的字节数。
27 * sizeof(TCHAR) 作为 cbData 产生的:
43 00 3A 00 5C 00 57 00 C.:.\.W.
49 00 4E 00 44 00 4F 00 I.N.D.O.
57 00 53 00 5C 00 73 00 W.S.\.s.
79 00 73 00 74 00 65 00 y.s.t.e.
6D 00 33 00 32 00 5C 00 m.3.2.\.
63 00 61 00 6C 00 63 00 c.a.l.c.
2E 00 65 00 78 00 ..e.x.
我在一些旧的 XP 上,服务包天知道是什么,我不知道其他版本的 windows 会如何处理它。
【问题讨论】:
-
您在主题中提供的信息的应用应该是标签,这意味着您在这里没有发布任何主题信息。请edit您的问题并这样做。标签信息属于标签;这里的标记系统非常好,不需要任何帮助。谢谢。
-
@Ken White 你能帮我吗?我找不到比这个更好的标题了。我认为堆栈溢出可以让人们选择编辑其他人的帖子。更改它以获得更准确的标题,我一定会接受它。
-
@Kocur4d:把你的标题变成了一个主题摘要,我希望这适合你。
-
@Ben Voigt 谢谢。
-
@Kocur4d:Ben 打败了我。 :-) 您的标题需要描述您的问题主题(标签中不包含的信息,并提供有关您所问内容的信息)。标签将问题分类为一般主题(在本例中为
winapi、c++),以便熟悉这些主题的人看到它们,以便将来的读者在搜索中正确找到它们。
标签: c++ c string winapi registry