본문 바로가기

Windows/Windows API

레지스트리 사용 (Registry)

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="Regi2";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
    
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
    
    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
         NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

#include "ShReg.h"
#define KEY "Software\\KanamSoft\\RegiTest2\\"
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    RECT rt;
    static HWND hEdit;
    char str[256];
    switch(iMessage) {
    case WM_CREATE:
        rt.left=SHRegReadInt(SHCU,KEY"Position","Left",0);
        rt.top=SHRegReadInt(SHCU,KEY"Position","Top",0);
        rt.right=SHRegReadInt(SHCU,KEY"Position","Right",300);
        rt.bottom=SHRegReadInt(SHCU,KEY"Position","Bottom",200);
        MoveWindow(hWnd, rt.left, rt.top, rt.right-rt.left,
            rt.bottom-rt.top, TRUE);
        hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
            ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)100,g_hInst,NULL);
        SHRegReadString(SHCU,KEY"Edit","Str","문자열",str,256);
        SetWindowText(hEdit,str);
        return 0;
    case WM_DESTROY:
        GetWindowRect(hWnd, &rt);
        SHRegWriteInt(SHCU,KEY"Position","Left",rt.left);
        SHRegWriteInt(SHCU,KEY"Position","Top",rt.top);
        SHRegWriteInt(SHCU,KEY"Position","Right",rt.right);
        SHRegWriteInt(SHCU,KEY"Position","Bottom",rt.bottom);
        GetWindowText(hEdit,str,256);
        SHRegWriteString(SHCU,KEY"Edit","Str",str);
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


#define SHLM HKEY_LOCAL_MACHINE
#define SHCU HKEY_CURRENT_USER
#define SHCR HKEY_CLASSES_ROOT

UINT SHRegReadInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, INT nDefault);
BOOL SHRegReadString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpDefault,
LPTSTR lpRet, DWORD nSize);
BOOL SHRegWriteInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, UINT nData);
BOOL SHRegWriteString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpData);


#include <windows.h>

// 정수값을 읽는다.
UINT SHRegReadInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, INT nDefault)
{
    HKEY key;
    DWORD dwDisp;
    UINT Result;
    DWORD Size;
    if (RegCreateKeyEx(hKey, lpKey,0,NULL,
        REG_OPTION_NON_VOLATILE, KEY_READ,NULL,&key,&dwDisp)
        !=ERROR_SUCCESS)
        return 0;
    Size=sizeof(LONG);
    if (RegQueryValueEx(key, lpValue, 0, NULL,(LPBYTE)&Result, &Size)
        !=ERROR_SUCCESS)
        Result=nDefault;
    RegCloseKey(key);
    return Result;
}

// 문자열을 읽는다.
BOOL SHRegReadString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpDefault,
LPTSTR lpRet, DWORD nSize)
{
    HKEY key;
    DWORD dwDisp;
    DWORD Size;
    if (RegCreateKeyEx(hKey, lpKey,0,NULL,
        REG_OPTION_NON_VOLATILE, KEY_READ,NULL,&key,&dwDisp)
        !=ERROR_SUCCESS)
        return FALSE;
    Size=nSize;
    if (RegQueryValueEx(key, lpValue, 0, NULL,(LPBYTE)lpRet, &Size)
        !=ERROR_SUCCESS) {
        strcpy(lpRet, lpDefault);
        return FALSE;
    }
    RegCloseKey(key);
    return TRUE;
}

// 정수값을 쓴다.
BOOL SHRegWriteInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, UINT nData)
{
    HKEY key;
    DWORD dwDisp;
    if (RegCreateKeyEx(hKey, lpKey,0,NULL,
        REG_OPTION_NON_VOLATILE, KEY_WRITE,NULL,&key,&dwDisp)
        !=ERROR_SUCCESS) {
        return FALSE;
    }
    if (RegSetValueEx(key, lpValue,0,REG_DWORD,(LPBYTE)&nData,sizeof(UINT))
        !=ERROR_SUCCESS)
        return FALSE;
    RegCloseKey(key);
    return TRUE;
}

// 문자열을 쓴다.
BOOL SHRegWriteString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpData)
{
    HKEY key;
    DWORD dwDisp;
    if (RegCreateKeyEx(hKey, lpKey,0,NULL,
        REG_OPTION_NON_VOLATILE, KEY_WRITE,NULL,&key,&dwDisp)
        !=ERROR_SUCCESS)
        return FALSE;
    if (RegSetValueEx(key, lpValue,0,REG_SZ,(LPBYTE)lpData,strlen(lpData)+1)
        !=ERROR_SUCCESS)
        return FALSE;
    RegCloseKey(key);
    return TRUE;
}