我有一个简单的程序,将 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. 当我定义字符串时,它会自动以空值终止吗?
LPCTSTR lpProgram = TEXT("C:\\WINDOWS\\system32\\calc.exe");
或者应该这样做:
LPCTSTR lpProgram = TEXT("C:\\WINDOWS\\system32\\calc.exe\0");
2. 在我的代码中,RegSetValueEx 的最后一个参数是否设置为正确的值?
cbData [in] lpData 参数指向的信息的大小,以字节为单位。如果数据的类型为 REG_SZ、REG_EXPAND_SZ 或 REG_MULTI_SZ,则 cbData 必须包括终止空字符的大小。
cchProgram设置为 28 个字符,无空终止。在我的系统上(因为我认为是 UNICODE?)cchProgram * sizeof(TCHAR) = 56。
我不应该将其设置为 58 以添加空终止吗?
当我运行这个程序时,如上所述,没有任何修改,我将通过修改二进制日期检查注册表中的计算器值,我得到:
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 会如何处理它。