今回は、レジストリを削除します。メニューで削除ができるようにします。
レジストリ1 - インコのWindowsSDK で作成したソースを修正します。
流れ
WM_CREATE
1.RegDeleteValue()でレジストリの値を削除します。
先にRegCreateKeyEx()や、RegOpenKeyEx()で、レジストリキーを開いている必要があります。
LONG RegDeleteValue( HKEY hKey, // キーのハンドル PCTSTR pszValuName // 削除する値の名前 );
2.RegDeleteKey()でレジストリキーを削除します。
キーがサブキーを持っていると削除できません。キーを削除するには、そのキーが持っているサブキーを先に削除する必要があります。
LONG RegDeleteKey( HKEY hKey, // キーのハンドル PCTSTR pszSubKey // 削除するキーの名前 );
ソースコードの入力
ソースコードは下記のように入れてください。
test.cpp
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include "resource.h"
#define SUB_KEY TEXT("Software\\my_test")
// このコード モジュールに含まれる関数の宣言を転送します:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
// アプリケーションの初期化を実行します:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// メイン メッセージ ループ:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
//
// 関数: MyRegisterClass()
//
// 目的: ウィンドウ クラスを登録します。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL , IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_HP);
wcex.lpszClassName = TEXT("HP");
wcex.hIconSm = LoadIcon(NULL , IDI_APPLICATION);
return RegisterClassEx(&wcex);
}
//
// 関数: InitInstance(HINSTANCE, int)
//
// 目的: メイン ウィンドウを作成します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(TEXT("HP"), TEXT("HP"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: メイン ウィンドウのメッセージを処理します。
//
// WM_CREATE - ウインドウ作成時の処理
// WM_COMMAND - アプリケーション メニューの処理
// WM_PAINT - メイン ウィンドウの描画
// WM_DESTROY - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR str[1024];
LONG lResult;
DWORD dwDisposition;
static HKEY hKeyResult;
DWORD dwData;
DWORD dwType = REG_DWORD;
static DWORD dwPostalNum;
switch (message)
{
case WM_CREATE:
/* レジストリキーを作成 */
lResult = RegCreateKeyEx(HKEY_CURRENT_USER,
SUB_KEY, NULL, TEXT(""), REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hKeyResult, &dwDisposition);
if (lResult == ERROR_SUCCESS)
{
if (dwDisposition == REG_CREATED_NEW_KEY)
{
MessageBox(NULL, TEXT("キーが存在しないので新たに作成しました"),
TEXT("OK"), MB_OK);
}
}
/* レジストリの値を取得 */
RegQueryValueEx(hKeyResult, TEXT("data00"), NULL, &dwType, NULL, &dwData);
RegQueryValueEx(hKeyResult, TEXT("data00"), NULL, &dwType,
(LPBYTE)&dwPostalNum, &dwData);
/* レジストリのキーを閉じる */
RegCloseKey(hKeyResult);
dwPostalNum++;
/* レジストリのキーを開く */
RegOpenKeyEx(HKEY_CURRENT_USER,
SUB_KEY, NULL,
KEY_ALL_ACCESS, &hKeyResult);
/* レジストリに保存 */
RegSetValueEx(hKeyResult, TEXT("data00"), 0, REG_DWORD,
(CONST BYTE*)&dwPostalNum, sizeof(dwPostalNum));
/* レジストリのキーを閉じる */
RegCloseKey(hKeyResult);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 選択されたメニューの解析:
switch (wmId)
{
case IDM_REGDELVAL:
/* レジストリのキーを開く */
RegOpenKeyEx(HKEY_CURRENT_USER,
SUB_KEY, NULL,
KEY_ALL_ACCESS, &hKeyResult);
/* レジストリ値の削除 */
lResult = RegDeleteValue(hKeyResult, TEXT("data00"));
if (lResult == ERROR_SUCCESS)
{
MessageBox(NULL, TEXT("レジストリ値を削除しました"),
TEXT("OK"), MB_OK);
dwPostalNum = 0;
// 無効領域を発生させて、WM_PAINTを発生させる
InvalidateRect(hWnd, NULL, FALSE);
}
/* レジストリのキーを閉じる */
RegCloseKey(hKeyResult);
break;
case IDM_REGDELVKEY:
/* レジストリのキーを開く */
RegOpenKeyEx(HKEY_CURRENT_USER,
SUB_KEY, NULL,
KEY_ALL_ACCESS, &hKeyResult);
/* レジストリキーの削除 */
lResult = RegDeleteKey(HKEY_CURRENT_USER, SUB_KEY);
if (lResult == ERROR_SUCCESS)
{
MessageBox(NULL, TEXT("レジストリキーを削除しました"),
TEXT("OK"), MB_OK);
dwPostalNum = 0;
// 無効領域を発生させて、WM_PAINTを発生させる
InvalidateRect(hWnd, NULL, FALSE);
}
/* レジストリのキーを閉じる */
RegCloseKey(hKeyResult);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
_stprintf_s(str, 255, TEXT("%d 回目の起動です。"), dwPostalNum);
TextOut(hdc, 10, 10, str, _tcslen(str));
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
上記の太線で示している箇所のみ追加です。
resource.h
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_HP 109
#define IDM_REGDELVAL 110
#define IDM_REGDELVKEY 111
上記の太線で示している箇所のみ追加です。
test.rc リソースファイル
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////
//
// メニュー
//
IDC_HP MENU
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "レジストリ値の削除(&V)", IDM_REGDELVAL
MENUITEM "レジストリキーの削除(&K)", IDM_REGDELVKEY
MENUITEM "アプリケーションの終了(&X)", IDM_EXIT
END
POPUP "ヘルプ(&H)"
BEGIN
MENUITEM "バージョン情報(&A)...", IDM_ABOUT
END
END
上記の太線で示している箇所のみ追加です。