• R/O
  • SSH
  • HTTPS

ttssh2:


File Info

Rev. 6975
Size 12,342 bytes
Time 2017-11-17 09:40:22
Author maya
Log Message

ttpmenu.ini の全セクション名を格納するバッファのサイズを拡張

Content

  1. //保存先にiniファイルを使用したい場合は、0バイトのファイルでよいのでttpmenu.exeと同じフォルダにttpmenu.iniを用意する
  2. #define STRICT
  3. static char *Registry_id =
  4. "@(#)Copyright (C) NTT-IT 1998 -- registry.cpp -- Ver1.00b1";
  5. /* ==========================================================================
  6. Project Name : Universal Library
  7. Outline : Registry Function
  8. Create : 1998-02-17(Tue)
  9. Update :
  10. Copyright : S.Hayakawa NTT-IT
  11. Reference :
  12. ======1=========2=========3=========4=========5=========6=========7======= */
  13. #include "registry.h"
  14. #include "tchar.h"
  15. #include "stdio.h"
  16. BOOL bUseINI = FALSE; // 保存先(TRUE=INI, FALSE=レジストリ)
  17. TCHAR szSectionName[MAX_PATH]; // INIのセクション名
  18. TCHAR szSectionNames[1024*10]={0}; // INIのセクション名一覧
  19. TCHAR szApplicationName[MAX_PATH]={0}; // INIファイルのフルパス
  20. BOOL getSection(LPCTSTR str)
  21. {
  22. szSectionNames[0] = 0;
  23. LPCTSTR t = _tcsrchr(str, _T('\\'));
  24. if(t){
  25. t++;
  26. }else{
  27. t = str;
  28. }
  29. _tcscpy(szSectionName, t);
  30. return TRUE;
  31. }
  32. LPCTSTR getModuleName()
  33. {
  34. if(*szApplicationName == 0){
  35. GetModuleFileName(NULL, szApplicationName, sizeof(TCHAR)*sizeof(szApplicationName));
  36. LPTSTR t = szApplicationName + _tcslen(szApplicationName) - 3;
  37. _tcscpy(t, _T("ini"));
  38. }
  39. return szApplicationName;
  40. }
  41. //exeと同じフォルダにiniファイルが存在すればiniを使用、その他の場合はレジストリを使用
  42. void checkIniFile()
  43. {
  44. DWORD dwAttr = ::GetFileAttributes(getModuleName());
  45. bUseINI = dwAttr != 0xFFFFFFFF;
  46. }
  47. /* ==========================================================================
  48. Function Name : (HKEY) RegCreate()
  49. Outline : 指定したレジストリキーを作成(またはオープン)する
  50. Arguments : HKEY hCurrentKey (in) 現在のオープンキー
  51. : LPCTSTR lpszKeyName (in) オープンするサブキーの
  52. : 名前
  53. Return Value : 成功 オープンまたは作成されたキーのハンドル
  54. : 失敗 NULL
  55. Reference :
  56. Renewal :
  57. Notes :
  58. Attention :
  59. Up Date :
  60. ======1=========2=========3=========4=========5=========6=========7======= */
  61. HKEY RegCreate(HKEY hCurrentKey, LPCTSTR lpszKeyName)
  62. {
  63. if(bUseINI){
  64. getSection(lpszKeyName);
  65. return ERROR_SUCCESS;
  66. }else{
  67. long lError;
  68. HKEY hkResult;
  69. DWORD dwDisposition;
  70. lError = ::RegCreateKeyEx(hCurrentKey,
  71. lpszKeyName,
  72. 0,
  73. NULL,
  74. REG_OPTION_NON_VOLATILE,
  75. KEY_ALL_ACCESS,
  76. NULL,
  77. &hkResult,
  78. &dwDisposition);
  79. if (lError != ERROR_SUCCESS) {
  80. ::SetLastError(lError);
  81. return (HKEY) INVALID_HANDLE_VALUE;
  82. }
  83. return hkResult;
  84. }
  85. }
  86. /* ==========================================================================
  87. Function Name : (HKEY) RegOpen()
  88. Outline : 指定したレジストリキーをオープンする
  89. Arguments : HKEY hCurrentKey (in) 現在のオープンキー
  90. : LPCTSTR lpszKeyName (in) オープンするサブキーの
  91. : 名前
  92. Return Value : 成功 オープンまたは作成されたキーのハンドル
  93. : 失敗 NULL
  94. Reference :
  95. Renewal :
  96. Notes :
  97. Attention :
  98. Up Date :
  99. ======1=========2=========3=========4=========5=========6=========7======= */
  100. HKEY RegOpen(HKEY hCurrentKey, LPCTSTR lpszKeyName)
  101. {
  102. if(bUseINI){
  103. getSection(lpszKeyName);
  104. return ERROR_SUCCESS;
  105. }else{
  106. long lError;
  107. HKEY hkResult;
  108. lError = ::RegOpenKeyEx(hCurrentKey,
  109. lpszKeyName,
  110. 0,
  111. KEY_ALL_ACCESS,
  112. &hkResult);
  113. if (lError != ERROR_SUCCESS) {
  114. ::SetLastError(lError);
  115. return (HKEY) INVALID_HANDLE_VALUE;
  116. }
  117. return hkResult;
  118. }
  119. }
  120. /* ==========================================================================
  121. Function Name : (BOOL) RegClose()
  122. Outline : 指定したレジストリキーをクローズする
  123. Arguments : HKEY hKey (in) クローズするキーのハンドル
  124. Return Value : 成功 TRUE
  125. : 失敗 FALSE
  126. Reference :
  127. Renewal :
  128. Notes :
  129. Attention :
  130. Up Date :
  131. ======1=========2=========3=========4=========5=========6=========7======= */
  132. BOOL RegClose(HKEY hKey)
  133. {
  134. if(bUseINI){
  135. }else{
  136. long lError;
  137. lError = ::RegCloseKey(hKey);
  138. if (lError != ERROR_SUCCESS) {
  139. ::SetLastError(lError);
  140. return FALSE;
  141. }
  142. }
  143. return TRUE;
  144. }
  145. /* ==========================================================================
  146. Function Name : (BOOL) RegSetStr()
  147. Outline : レジストリキーの値に文字列を書き込む
  148. Arguments : HKEY hKey (in) 値を設定するキーのハンドル
  149. : LPCTSTR lpszValueName (in) 設定する値
  150. : char *buf (in) 値データ
  151. Return Value : 成功 TRUE
  152. : 失敗 FALSE
  153. Reference :
  154. Renewal :
  155. Notes :
  156. Attention :
  157. Up Date :
  158. ======1=========2=========3=========4=========5=========6=========7======= */
  159. BOOL RegSetStr(HKEY hKey, LPCTSTR lpszValueName, TCHAR *buf)
  160. {
  161. if(bUseINI){
  162. return WritePrivateProfileString(szSectionName, lpszValueName, buf, getModuleName());
  163. }else{
  164. long lError;
  165. lError = ::RegSetValueEx(hKey,
  166. lpszValueName,
  167. 0,
  168. REG_SZ,
  169. (CONST BYTE *) buf,
  170. (::lstrlen(buf) + 1) * sizeof(TCHAR));
  171. if (lError != ERROR_SUCCESS) {
  172. ::SetLastError(lError);
  173. return FALSE;
  174. }
  175. }
  176. return TRUE;
  177. }
  178. /* ==========================================================================
  179. Function Name : (BOOL) RegGetStr()
  180. Outline : レジストリキーの値から文字列を読み込む
  181. Arguments : HKEY hKey (in) 値を設定するキーの
  182. : ハンドル
  183. : LPCTSTR lpszValueName (in) 設定する値
  184. : char *buf (out) 値データを格納する
  185. : バッファ
  186. : DWORD dwSize (in/out) 文字数
  187. Return Value : 成功 TRUE
  188. : 失敗 FALSE
  189. Reference :
  190. Renewal :
  191. Notes :
  192. Attention :
  193. Up Date :
  194. ======1=========2=========3=========4=========5=========6=========7======= */
  195. BOOL RegGetStr(HKEY hKey, LPCTSTR lpszValueName, TCHAR *buf, DWORD dwSize)
  196. {
  197. if(bUseINI){
  198. return GetPrivateProfileString(szSectionName, lpszValueName, _T(""), buf, dwSize, getModuleName());
  199. }else{
  200. LONG lError;
  201. DWORD dwWriteSize;
  202. DWORD dwType = REG_SZ;
  203. dwWriteSize = dwSize * sizeof(TCHAR);
  204. lError = ::RegQueryValueEx(hKey, lpszValueName, 0, &dwType, (LPBYTE) buf, &dwWriteSize);
  205. if (lError != ERROR_SUCCESS) {
  206. ::SetLastError(lError);
  207. return FALSE;
  208. }
  209. buf[dwSize - 1] = '\0';
  210. }
  211. return TRUE;
  212. }
  213. /* ==========================================================================
  214. Function Name : (BOOL) RegSetDword()
  215. Outline : レジストリキーの値に DWORDを書き込む
  216. Arguments : HKEY hKey (in) 値を設定するキーのハンドル
  217. : LPCTSTR lpszValueName (in) 設定する値
  218. : DWORD dwValue (in) 値データ
  219. Return Value : 成功 TRUE
  220. : 失敗 FALSE
  221. Reference :
  222. Renewal :
  223. Notes :
  224. Attention :
  225. Up Date :
  226. ======1=========2=========3=========4=========5=========6=========7======= */
  227. BOOL RegSetDword(HKEY hKey, LPCTSTR lpszValueName, DWORD dwValue)
  228. {
  229. if(bUseINI){
  230. TCHAR t[64];
  231. _stprintf(t, _T("%d"), dwValue);
  232. return WritePrivateProfileString(szSectionName, lpszValueName, t, getModuleName());
  233. }else{
  234. long lError;
  235. lError = ::RegSetValueEx(hKey,
  236. lpszValueName,
  237. 0,
  238. REG_DWORD,
  239. (CONST BYTE *) &dwValue,
  240. sizeof(DWORD));
  241. if (lError != ERROR_SUCCESS) {
  242. ::SetLastError(lError);
  243. return FALSE;
  244. }
  245. }
  246. return TRUE;
  247. }
  248. /* ==========================================================================
  249. Function Name : (BOOL) RegGetDword()
  250. Outline : レジストリキーの値から DWORDを読み込む
  251. Arguments : HKEY hKey (in) 値を設定するキーのハンドル
  252. : LPCTSTR lpszValueName (in) 設定する値
  253. : DWORD *dwValue (out) 値データ
  254. Return Value : 成功 TRUE
  255. : 失敗 FALSE
  256. Reference :
  257. Renewal :
  258. Notes :
  259. Attention :
  260. Up Date :
  261. ======1=========2=========3=========4=========5=========6=========7======= */
  262. BOOL RegGetDword(HKEY hKey, LPCTSTR lpszValueName, DWORD *dwValue)
  263. {
  264. int defmark = 0xdeadbeef;
  265. if(bUseINI){
  266. // 読み込みに失敗した場合は false を返す (2007.11.14 yutaka)
  267. *dwValue = GetPrivateProfileInt(szSectionName, lpszValueName, defmark, getModuleName());
  268. if (*dwValue == defmark) {
  269. *dwValue = 0;
  270. return FALSE;
  271. } else {
  272. return TRUE;
  273. }
  274. }else{
  275. long lError;
  276. DWORD dwType = REG_DWORD;
  277. DWORD dwSize = sizeof(DWORD);
  278. lError = ::RegQueryValueEx(hKey,
  279. lpszValueName,
  280. 0,
  281. &dwType,
  282. (LPBYTE) dwValue,
  283. &dwSize);
  284. if (lError != ERROR_SUCCESS) {
  285. ::SetLastError(lError);
  286. return FALSE;
  287. }
  288. }
  289. return TRUE;
  290. }
  291. /* ==========================================================================
  292. Function Name : (BOOL) RegSetBinary()
  293. Outline : レジストリキーの値から BINARYを読み込む
  294. Arguments : HKEY hKey (in) 値を設定するキーのハンドル
  295. : LPCTSTR lpszValueName (in) 設定する値
  296. : void *buf (out) 値データ
  297. Return Value : 成功 TRUE
  298. : 失敗 FALSE
  299. Reference :
  300. Renewal :
  301. Notes :
  302. Attention :
  303. Up Date :
  304. ======1=========2=========3=========4=========5=========6=========7======= */
  305. BOOL RegSetBinary(HKEY hKey, LPCTSTR lpszValueName, void *buf, DWORD dwSize)
  306. {
  307. if(bUseINI){
  308. TCHAR t[1024] = {0};
  309. LPBYTE s = (LPBYTE)buf;
  310. for(DWORD i=0; i<dwSize; i++){
  311. TCHAR c[4];
  312. _stprintf(c, _T("%02X "), s[i]);
  313. _tcscat(t, c);
  314. }
  315. BOOL ret = WritePrivateProfileString(szSectionName, lpszValueName, t, getModuleName());
  316. return ret;
  317. }else{
  318. long lError;
  319. DWORD dwWriteSize;
  320. dwWriteSize = dwSize * sizeof(TCHAR);
  321. if ((lError = ::RegSetValueEx(hKey,
  322. lpszValueName,
  323. 0,
  324. REG_BINARY,
  325. (CONST BYTE *) buf,
  326. dwWriteSize)) != ERROR_SUCCESS) {
  327. ::SetLastError(lError);
  328. return FALSE;
  329. }
  330. }
  331. return TRUE;
  332. }
  333. /* ==========================================================================
  334. Function Name : (BOOL) RegGetBinary()
  335. Outline : レジストリキーの値から BINARYを読み込む
  336. Arguments : HKEY hKey (in) 値を設定するキーのハンドル
  337. : LPCTSTR lpszValueName (in) 設定する値
  338. : int *buf (out) 値データ
  339. Return Value : 成功 TRUE
  340. : 失敗 FALSE
  341. Reference :
  342. Renewal :
  343. Notes :
  344. Attention :
  345. Up Date :
  346. ======1=========2=========3=========4=========5=========6=========7======= */
  347. // 関数の返値の型を追加 (2006.2.18 yutaka)
  348. int RegGetBinary(HKEY hKey, LPCTSTR lpszValueName, void *buf, LPDWORD lpdwSize)
  349. {
  350. if(bUseINI){
  351. TCHAR t[1024] = {0};
  352. BOOL ret = GetPrivateProfileString(szSectionName, lpszValueName, _T(""), t, sizeof(t), getModuleName());
  353. if(ret){
  354. int size = _tcslen(t);
  355. while(t[size-1] == ' '){
  356. size--;
  357. t[size] = 0;
  358. }
  359. LPCTSTR s = t;
  360. LPBYTE p = (LPBYTE)buf;
  361. DWORD cnt = 0;
  362. *p = 0;
  363. for(int i=0; i<(size+1)/3; i++){
  364. *p++ = (BYTE)_tcstol(s, NULL, 16);
  365. s += 3;
  366. cnt ++;
  367. }
  368. *lpdwSize = cnt;
  369. }
  370. return ret;
  371. }else{
  372. long lError;
  373. DWORD dwType = REG_BINARY;
  374. DWORD dwWriteSize;
  375. dwWriteSize = *lpdwSize * sizeof(TCHAR);
  376. if ((lError = ::RegQueryValueEx(hKey,
  377. lpszValueName,
  378. NULL,
  379. &dwType,
  380. (LPBYTE) buf,
  381. &dwWriteSize)) != ERROR_SUCCESS) {
  382. ::SetLastError(lError);
  383. return FALSE;
  384. }
  385. }
  386. return TRUE;
  387. }
  388. LONG RegEnumEx(HKEY hKey, DWORD dwIndex, LPTSTR lpName, LPDWORD lpcName, LPDWORD lpReserved, LPTSTR lpClass, LPDWORD lpcClass, PFILETIME lpftLastWriteTime)
  389. {
  390. static LPCTSTR ptr = szSectionNames;
  391. if(bUseINI){
  392. if(*szSectionNames == 0){
  393. GetPrivateProfileSectionNames(szSectionNames, sizeof(szSectionNames), getModuleName());
  394. ptr = szSectionNames;
  395. }
  396. if(_tcscmp(ptr, _T("TTermMenu")) == 0){
  397. //skip
  398. while(*ptr++);
  399. // ptr++;
  400. }
  401. if(*ptr == 0){
  402. return ERROR_NO_MORE_ITEMS;
  403. }
  404. _tcscpy(lpName, ptr);
  405. while(*ptr++);
  406. // ptr++;
  407. return ERROR_SUCCESS;
  408. }else{
  409. return ::RegEnumKeyEx(hKey, dwIndex, lpName, lpcName, lpReserved, lpClass, lpcClass, lpftLastWriteTime);
  410. }
  411. }
  412. LONG RegDelete(HKEY hKey, LPCTSTR lpSubKey)
  413. {
  414. if(bUseINI){
  415. return WritePrivateProfileString(szSectionName, NULL, NULL, getModuleName()) ? ERROR_SUCCESS : ERROR_ACCESS_DENIED;
  416. }else{
  417. return ::RegDeleteKey(hKey, lpSubKey);
  418. }
  419. }
Show on old repository browser