上一篇介绍了VB.NET读写WinCE注册表的方法,用着确实方便。在驱动或者应用程序开发的过程中,其实也有一种简便的方法读写注册表,使用微软提供的CReg类(Registry helper class)。用法也很简单,只要包括creg.hxx即可,SDK中一般会包含该头文件。
闲话少说,直接附上代码,供参考。
1
//
Preloader.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include " stdafx.h "
5 #include < windows.h >
6 #include " creg.hxx "
7
8 #define GET_PATH_FROM_REG
9
10 #define REG_ROOT HKEY_CURRENT_USER
11 #define REG_PATH _T("Software")
12 #define REG_NAME _T("AutoRunApp")
13 # define INI_PATH _T("\\Config.ini")
14 #define WINCE_STANDARD_SHELL _T("\\windows\\explorer.exe")
15
16 static TCHAR g_szFilePath[MAX_PATH];
17
18 #ifdef GET_PATH_FROM_REG // 从注册表中读取需开机时自启动程序的完整路径
19 static BOOL GetFilePath(TCHAR * pFileName)
20 {
21 if (pFileName)
22 {
23 CReg Reg;
24 DWORD dwLen = MAX_PATH;
25 Reg.Create(REG_ROOT,REG_PATH);
26 if (Reg.ValueSZ(REG_NAME,pFileName,dwLen))
27 {
28 return TRUE;
29 }
30 }
31
32 return FALSE;
33 }
34 #else // 从文件中读取需开机时自启动程序的完整路径
35 static BOOL GetFilePath(TCHAR * pFileName)
36 {
37 int nIndex;
38
39 if (pFileName)
40 {
41 HANDLE hFile = INVALID_HANDLE_VALUE;
42 char szPath[MAX_PATH];
43 DWORD dwRead;
44 hFile = CreateFile(INI_PATH,GENERIC_READ, 0 ,NULL,OPEN_EXISTING, 0 ,NULL);
45 if (hFile != INVALID_HANDLE_VALUE)
46 {
47 ReadFile(hFile,szPath,MAX_PATH, & dwRead,NULL);
48 for (nIndex = 0 ; nIndex < dwRead; nIndex ++ )
49 {
50 if (szPath[nIndex] == ' \r ' || szPath[nIndex] == ' \n ' )
51 {
52 break ;
53 }
54 * pFileName ++ = szPath[nIndex];
55 }
56
57 * pFileName = _T( ' \0 ' );
58
59 CloseHandle(hFile);
60 return TRUE;
61 }
62 }
63
64 return FALSE;
65 }
66 #endif
67
68 static BOOL IsFileExist(TCHAR * pFileName)
69 {
70 if (pFileName)
71 {
72 HANDLE hFind = INVALID_HANDLE_VALUE;
73 WIN32_FIND_DATA fd;
74
75 RETAILMSG( 1 ,(TEXT( " \r\nIsFileExist(%s) " ),pFileName));
76
77 hFind = FindFirstFile(pFileName, & fd);
78
79 if (INVALID_HANDLE_VALUE != hFind)
80 {
81 FindClose(hFind);
82 return TRUE;
83 }
84 }
85
86 return FALSE;
87 }
88
89 static BOOL RunAppFile(TCHAR * pFilePath)
90 {
91 if (pFilePath)
92 {
93 PROCESS_INFORMATION pi;
94 BOOL bRet = FALSE;
95 bRet = CreateProcess(pFilePath,NULL,NULL,NULL,FALSE, 0 ,NULL,
96 NULL,NULL, & pi);
97 if (bRet)
98 {
99 CloseHandle(pi.hThread);
100 CloseHandle(pi.hProcess);
101 return TRUE;
102 }
103 }
104
105 return FALSE;
106 }
107
108 int _tmain( int argc, _TCHAR * argv[])
109 {
110 // 获取开机时需自启动程序的完整路径
111 // 判断该程序否存在
112 // 如果程序存在,则启动该程序,如果不存在,则启动WinCE默认的Shell
113 if (GetFilePath(g_szFilePath))
114 {
115 if (IsFileExist(g_szFilePath))
116 {
117 if (RunAppFile(g_szFilePath))
118 {
119 return 0 ;
120 }
121 }
122 }
123
124 RunAppFile(WINCE_STANDARD_SHELL);
125
126 return 0 ;
127 }
2 //
3
4 #include " stdafx.h "
5 #include < windows.h >
6 #include " creg.hxx "
7
8 #define GET_PATH_FROM_REG
9
10 #define REG_ROOT HKEY_CURRENT_USER
11 #define REG_PATH _T("Software")
12 #define REG_NAME _T("AutoRunApp")
13 # define INI_PATH _T("\\Config.ini")
14 #define WINCE_STANDARD_SHELL _T("\\windows\\explorer.exe")
15
16 static TCHAR g_szFilePath[MAX_PATH];
17
18 #ifdef GET_PATH_FROM_REG // 从注册表中读取需开机时自启动程序的完整路径
19 static BOOL GetFilePath(TCHAR * pFileName)
20 {
21 if (pFileName)
22 {
23 CReg Reg;
24 DWORD dwLen = MAX_PATH;
25 Reg.Create(REG_ROOT,REG_PATH);
26 if (Reg.ValueSZ(REG_NAME,pFileName,dwLen))
27 {
28 return TRUE;
29 }
30 }
31
32 return FALSE;
33 }
34 #else // 从文件中读取需开机时自启动程序的完整路径
35 static BOOL GetFilePath(TCHAR * pFileName)
36 {
37 int nIndex;
38
39 if (pFileName)
40 {
41 HANDLE hFile = INVALID_HANDLE_VALUE;
42 char szPath[MAX_PATH];
43 DWORD dwRead;
44 hFile = CreateFile(INI_PATH,GENERIC_READ, 0 ,NULL,OPEN_EXISTING, 0 ,NULL);
45 if (hFile != INVALID_HANDLE_VALUE)
46 {
47 ReadFile(hFile,szPath,MAX_PATH, & dwRead,NULL);
48 for (nIndex = 0 ; nIndex < dwRead; nIndex ++ )
49 {
50 if (szPath[nIndex] == ' \r ' || szPath[nIndex] == ' \n ' )
51 {
52 break ;
53 }
54 * pFileName ++ = szPath[nIndex];
55 }
56
57 * pFileName = _T( ' \0 ' );
58
59 CloseHandle(hFile);
60 return TRUE;
61 }
62 }
63
64 return FALSE;
65 }
66 #endif
67
68 static BOOL IsFileExist(TCHAR * pFileName)
69 {
70 if (pFileName)
71 {
72 HANDLE hFind = INVALID_HANDLE_VALUE;
73 WIN32_FIND_DATA fd;
74
75 RETAILMSG( 1 ,(TEXT( " \r\nIsFileExist(%s) " ),pFileName));
76
77 hFind = FindFirstFile(pFileName, & fd);
78
79 if (INVALID_HANDLE_VALUE != hFind)
80 {
81 FindClose(hFind);
82 return TRUE;
83 }
84 }
85
86 return FALSE;
87 }
88
89 static BOOL RunAppFile(TCHAR * pFilePath)
90 {
91 if (pFilePath)
92 {
93 PROCESS_INFORMATION pi;
94 BOOL bRet = FALSE;
95 bRet = CreateProcess(pFilePath,NULL,NULL,NULL,FALSE, 0 ,NULL,
96 NULL,NULL, & pi);
97 if (bRet)
98 {
99 CloseHandle(pi.hThread);
100 CloseHandle(pi.hProcess);
101 return TRUE;
102 }
103 }
104
105 return FALSE;
106 }
107
108 int _tmain( int argc, _TCHAR * argv[])
109 {
110 // 获取开机时需自启动程序的完整路径
111 // 判断该程序否存在
112 // 如果程序存在,则启动该程序,如果不存在,则启动WinCE默认的Shell
113 if (GetFilePath(g_szFilePath))
114 {
115 if (IsFileExist(g_szFilePath))
116 {
117 if (RunAppFile(g_szFilePath))
118 {
119 return 0 ;
120 }
121 }
122 }
123
124 RunAppFile(WINCE_STANDARD_SHELL);
125
126 return 0 ;
127 }