Post List

2017년 11월 29일 수요일

nRF 51 DK DFU 사용해보기

 이제 대망의 마지막 파트!! DFU를 해보겠다.
 DFU란 여러 곳에서 잘 정의 해줬는데 나는 다음과 같이 생각한다. 임의의 통신프로토콜(BLE, UART 등등)로 firmware를 업데이트 해주는 과정을 말한다. firmware란 하드웨어에 반영구적으로 저장되어 있는 소프트웨어라 하는데 그냥 우리는 softdevice + bootloader + application 을 통틀어 말하는 거라고 보면 된다.(nRF 칩에 올라가는 모든 소프트웨어들)

 DFU를 쓰는 이유는 귀찮게 USB케이블로 pc와 DK 보드를 연결한 뒤 프로그래밍할 필요 없이 BLE나 다른 편리한 통신으로 firmware를 업뎃 할 수 있어서다. 좀 더 쉽게 말하면 DK 보드는 안에 Jlink가 내장되있어 그나마 편리하게 소프트웨어들을 업로드 할 수 있지만 다른 nRF 모듈들은 비싼 디버깅 케이블을 사서 연결해야만 가능하다.

 먼저 DK 보드를 통해서 DFU를 해보고 다른 nRF 모듈에 적용해보길 바란다!

 DFU를 하기 위해선 또다른 소프트웨어가 필요하다. 바로 bootloader 이다. 흔히 bootloader라고하면 pc를 시작시킬 때 가장 먼저 작동하는 소프트웨어로, 다른 중요한 소프트웨어들을 RAM에 올려주고 시작시켜주는 소프트웨어인데 여기서는 좀 다른 의미인 것 같다. nRF에서 제공하는 bootloader에 대해 깊이 공부하진 않았지만 이녀석은 nRF 칩이 처음 시동될 때 DFU 모드로 들어가줄 수 있게 해주는 장치라고 보면 된다.
 nRF 51 DK를 예로 들면 처음 전력이 공급 될 때 button 4가 눌려있으면 DFU 모드로 진입하고 그렇지 않다면 프로그래밍한 application을 실행시켜 준다.
 그러므로 DFU를 사용하지 않을 경우 처음부터 bootloader를 nRF 칩에 올릴 필요도 없다.

nRF 51 DK에 Bootloader 올리기

1. nRFgo studio를 통해 칩위의 프로그램들을 eraseall 한다.
2. SDK v11.xxx 에 있는 softdevice s130를 올린다. (nordic 사에서 제공해주는 튜토리얼을 토대로 공부했는데 v11를 기준으로 설명했으므로 여기서도 그렇게 하자.)
3. nRF5_SDK_xxx\examples\dfu\bootloader\pca10028\dual_bank_ble_s130\arm5_no_packs\dfu_dual_bank_ble_s130_pca10028.uvprojx 을 실행시켜 컴파일 및 보드에 업로드 한다.
(여기서 에러가 뜬다면
 Keil MDK 의 상단 탭 메뉴중에 Project>Option For Target 'xxx'>Utillities 상단탭 에 들어간다.
Configure Flash Menu Command 부분에서 Use External Tool for  Flash Programming 을 체크하고 Command 에는 nrfjprog.exe, Arguments에는 --reset --program "#H"을 기입한다.
자세한 건 https://devzone.nordicsemi.com/tutorials/9/여기 참고)

 짠! 그러면 보드 LED1,3가 반짝 빛나고 있을 것이다. 위 3번과정이 DK 보드에  bootloader를 올리는 과정이었다. 이제 앞으로 여기에 어떤 application을 넣어도 DK 보드에 전원을 넣을 시 button4를 누르고 있으면 DFU모드로 들어갈 것이다.

 그럼 DFU 를 이용해 application을 업로드 해봅시다. 그럴려면 핸드폰을 통해서 업로드하는게 편리한데 nRF toolbox라는 앱을 깔아 놔야한다. 그리고 application 파일을 특정 포맷인 zip 파일로 변환하는 과정이 필요하다. zip파일로 변환 후 핸드폰에 파일을 옮기고 nRF toolbox로 application을 업로드하면 된다.

application을 zip파일로 변환하는 방법

1. zip 파일로 변환 하기 위해선 MCP(master control panel)를 설치해야한다. 이녀석의 설치 경로는 다음과 같다.
https://www.nordicsemi.com/eng/Products/nRF51-DK 여기에 들어간 후 DOWNLOADS 탭에 들어가면 아래와 같은 항목이 있는데 윈도우 버젼에 맞게 설치한다.
nRF-MCP-x64Master Control Panel with Master Emulator API (64-bit)3.10.0
nRF-MCP-x86Master Control Panel with Master Emulator API (32-bit)3.10.0

2. 원하는 application을 Keil MDK를 통해 컴파일 한 후 컴파일 된 hex 파일을(_build 폴더 내에 있음) 다음의 위치에 복사한다. 
C:\program files\Nordic Semiconductor\Master Control Panel\3.10.0.14\nrf
 그 후에 cmd를 관리자 권한으로 실행한 후 위의 디렉토리로 이동해 다음의 명령어를 실행 한다.
nrfutil.exe dfu genpkg application.zip --application application.hex --application-version 0xffffffff --dev-revision 0xffff --dev-type 0xffff --sd-req 0xfffe

 위에서 빨간색 부분에 복사해온 hex파일 이름을 넣어 주면된다. 만일 application이 아닌 softdevice, bootloader를 zip으로 변환하고 싶다면 --aplication --softdevice 또는 --bootloader 로 바꿔주면 된다.
 위 명령어는 version이나 type 등을 다 default로 넣어주었지만 customizing 하고 싶다면 다음을 참고해주면 된다.

폰에서 nRF 칩으로 DFU 하기

1. 위 과정을 통해 얻은 zip파일을 드라이브 앱등을 통해 폰으로 옮긴다.
2. nRF toolbox 앱을 실행한 후 DFU에 들어간다.
3. Select File에서 저장한 zip파일을 선택하고 Select Device에서 DfuTarg 또는 DfuTest를 선택 한다.
4. Upload 하면 끝!!! 만일 여기서 upload 과정(퍼센티지 뜨는 거)이 안나오면 해당 application 과 softdevice가 호환이 안되서 그럴 가능성이 크다.

주의할 점!!!!! 

이제 다른 nRF 모듈에서 DFU를 사용해 firmware를 올릴건데 bootloader를 업데이트할 때는 반드시 bootloader의 버전과 모듈의 버전이 같은지 확인하고 올리자. 만일 다른걸 올리게 될 경우 벽돌이 될 수도 있다....


Reference :

nRF 51 DK ble_app_beacon 예제 및 BLE 구조

beacon 은 단순히 pairing 하지 않고 advertising 만 하는 것을 말한다. beacon 예제를 하기전에 먼저 BLE에 대해서 공부하고 하는 게 좋다.

BLE에 대해 잘 설명된 블로그 :

https://devzone.nordicsemi.com/tutorials/37/ nordic에서 제공하는 강의로 제일 잘 설명되어 있는 듯하다.
http://blog-kr.zoyi.co/bluetooth-low-energy-ble/ 한글 블로그인데 괜찮다.

자, BLE에 대해 대충 공부했으면 이를 nRF 칩에서 어떻게 구현되는지가 정말 중요하다. nordic에서 제공해주는 강의를 보면 잘 나와 있다. 
softdevice라는 소프트웨어를 통해 복잡한 블루투스 protocol stack을 구현해주고 우리는 단순히 softdevice에서 제공해주는 api함수를 이용해 설정을 변경하면 된다. 따라서 api의 사용법을 잘 익혀야 한다.

바로 beacon 예제를 보면 엄청나게 복잡한데 LED를 깜빡거리게 해주는 timer, 디버깅을 위한 debugger, UICR 메모리의 사용 등 beacon 자체에 필요없는 코드를 싹 빼버린 코드가 아래와 같다.(s130을 기준으로 짠 코드, peripheral 과 central 모두 지원해주는 softdevice이다. peripheral만을 사용할거면 s110을 쓰면 되는데 이는 SDK v10 까지 지원한다.)
또한 sd_xxx 로 시작되는 함수들이 softdevice에서 제공해주는 api이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdbool.h>
#include <stdint.h>
#include "ble_advdata.h"
#include "softdevice_handler.h"
#include "bsp.h"
 
#define CENTRAL_LINK_COUNT              0                                 /**< Number of central links used by the application. When changing this number remember to adjust the RAM settings*/
#define PERIPHERAL_LINK_COUNT           0                                 /**< Number of peripheral links used by the application. When changing this number remember to adjust the RAM settings*/
 
static void advertising_init(void)//여기서는 advertising data만 다룸
{
 
    uint8_t adv_data[15= {0x08,0x09,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x02,0x01,0x04};//(8길이,9번째타입,'ABCDEFG' HEX값) + (2길이, 1번째 타입(flag), flag값)
    uint8_t adv_data_length = 15;
 
    sd_ble_gap_adv_data_set(adv_data, adv_data_length, NULLNULL); //뒤에 3,4번째 NULL값은 scan response data를 넣어주면 됨(나는 안 넣음)
}
 
 
static void advertising_start(void)//advertising 설정을 다룸
{
    ble_gap_adv_params_t m_adv_params;
 
    memset(&m_adv_params, 0sizeof(m_adv_params));
 
    m_adv_params.type        = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND; //advertising type이 4가지가 있는데 Keil에서 정의부분을 참고하면 이해될 겁니다.
       m_adv_params.p_peer_addr = NULL;                             // Undirected advertisement.
       m_adv_params.fp          = BLE_GAP_ADV_FP_ANY;                 //
       m_adv_params.interval    = MSEC_TO_UNITS(100, UNIT_0_625_MS);//advertising 간격. millisec 단위다.
       m_adv_params.timeout     = 0;                                 //몇초 뒤에 advertising을 멈출지 설정. 0이면 계속하는 것
    ble_gap_adv_ch_mask_t        ch_mask;                         //broadcasting 주파수 채널 설정
 
    ch_mask.ch_37_off = 0;//37,38,39채널에서 브로드캐스팅
    ch_mask.ch_38_off = 0;
    ch_mask.ch_39_off = 0;
    m_adv_params.channel_mask = ch_mask;
 
    sd_ble_gap_tx_power_set(0);//tx power 설정 -30, -20, -16, -12, -8, -4, 0, 4
 
    sd_ble_gap_adv_start(&m_adv_params);
}
 
 
static void ble_stack_init(void//bluetooth protocol stack 이니셜라이징 하는 부분으로 수정하지 않는게 좋음.
{
    nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
 
    // Initialize the SoftDevice handler module.
    SOFTDEVICE_HANDLER_INIT(&clock_lf_cfg, NULL);
 
    ble_enable_params_t ble_enable_params;
    softdevice_enable_get_default_config(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT,&ble_enable_params);
 
    //Check the ram settings against the used number of links
    CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT);
 
    // Enable BLE stack.
    softdevice_enable(&ble_enable_params);
}
 
static void power_manage(void//다음 event가 발생할 때까지 저전력모드를 유지해주는 함수
{
    sd_app_evt_wait();
}
 
int main(void)
{
    ble_stack_init();
    advertising_init();
    advertising_start();
 
    for (;; )
    {
          power_manage();
    }
}
cs

이 코드에서 부가 설명할 부분은 advertising_start()함수 내에서 adv_data 변수에 데이터를 넣는 방법이다. 사실 기존 SDK 예제 코드는 장황하게 여러 클래스들을 사용하여 좀더 편리?하게 데이터를 넣을 수 있다. 그치만 코드의 간단함을 위해 raw하게 넣어 봤다.
하나의 데이터를 넣을 경우 1.데이터의 길이, 2.데이터 타입, 3.데이터 값 이 순서로 넣어주면 된다. 여러개의 데이터를 넣는 경우 위 형식을 그대로 나열해서 넣으면 된다. 데이터 타입에 대해서는 https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile 여기에 나와있으니 참고 바란다.

nRF51 DK blink 예제 코드 설명

Keil MDK가 좋은게 SDK 예제 중에 모르는 함수나 변수가 있으면 해당 정의 부분을 바로 찾아주는 기능이 있다. 원래는 include한 header들 중에서 거치고 거쳐 정의를 찾아내야 한다.

위 그림 처럼 모르는 함수나 변수위에 마우스를 오르고 우클릭을 하면 중간 쯤에 "Go To Definition Of 'xxxx'" 이 있는데 이걸 클릭하면 바로 정의 부분을 보여준다.

blink 예제를 단순 주석을 통해 설명할 건데 보다가 이해안가는게 있으면 위와 같은 방법으로 직접 정의 부분을 보면 되겠다.
그래도 이해가 안가는 함수나 변수가 있다 하면 nordic사의 홈페이지를 이용해 확인 하면 된다. 예를 들어 LEDS_INVERT 함수가 이해안갈때를 보자.
http://infocenter.nordicsemi.com/index.jsp 여기에 들어가서 위 그림처럼 검색창에 입력하면 여러 검색결과가 나온다. 검색 범위를 좀더 좁히기 위해선 SDK 버전을 같이 써주면 좋은데 난 v11을 쓰기 떄문에 "LEDS_INVERT SDK v11" 이라고 검색했다. 그럼 자세히 설명된 글이 나올 것이다.

blink 예제 설명 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "boards.h"
 
const uint8_t leds_list[LEDS_NUMBER] = LEDS_LIST; // LED_LIST는 pca10028.h에 정의 되있는 변수. nRF51 DK 보드 위에 있는 LED의 pin번호값이 저장되어 있음
 
int main(void)
{
    LEDS_CONFIGURE(LEDS_MASK); //LED를 초기화 해주는 부분. LED와 연결되어 있는 pin을 output 모드로 설정.
 
    while (true)
    {
        for (int i = 0; i < LEDS_NUMBER; i++)
        {
            LEDS_INVERT(1 << leds_list[i]); //LED와 연결된 핀의 출력을 뒤집어줌, 0이었으면 1로, 1이었으면 0으로.
            nrf_delay_ms(500); //해당 정의부분을 보면 왠 어셈블리어같은 언어로 쓰여져 있다. 동작원리를 굳이 알필요없이 기능만 알면 될 듯.
        }
    }
}
cs

2017년 11월 28일 화요일

nRF51 DK 예제 돌리기

간단히 실습을 해보기위해 설치한 SDK 폴더내에 있는 blink 프로젝트를 실행해 봅시다.


1. nRF51 DK 위에 올려져 있는 프로그램들 지우기

1) 먼저 USB 케이블선으로 nRF51 DK와 pc를 연결한다.
2) 불이 안들어오면 DK 왼쪽하단 스위치를 ON 하면 된다.(뒷면에 따로 배터리를 넣을 필요 없음. 만약 스위치를 켰는데 불이 깜빡거리면 다른 USB 케이블선을 이용해봅시다.)
3) nRFgo studio를 열면 왼쪽 list에서 Device Manger 부분이 있는데 nRF51 development boads에서 Segger xxx를 클릭 하자.

4) 클릭하면 오른쪽에 해당 보드에 관련된 정보들이 뜨는데 하단에 있는 eraseall 버튼을 눌러 프로그램들을 다 지워버리자.

2. SoftDevice 프로그램, 보드(nRF51 DK)에 올리기

nRFgo studio 창 오른쪽에 잘 넘기다 보면 Program SoftDevice 탭이 나온다.

여기서 softdevice 파일을 선택하고 program 버튼을 누르면 된다.

softdevice 파일 위치 : nRF5_SDK_xxxxx\components\softdevice\s130\hex\s130_nrf51_2.0.0_softdevice.hex
softdevice가 뭔지에 대해서는 나중에 알려주겠지만 단순히 말하자면 nRF 칩내에 있는 BLE 모듈을 사용할 수 있게 해주는 소프트웨어라고 생각하면 된다. 종류로는 s110, s112, s130 등등이 있는 데 자세한건 노르딕 홈페이지를 보면 된다. 굳이 벌써부터 softdevice에 대해 알려고하면 머리아프니 일단 넘어갑시다.

3. SDK 예제 파일 실행 하기

1) 먼저 설치한 SDK zip파일의 압축을 풉시다.
2) 아래의 위치에 있는 Keil project file을 실행 한다.(blink 예제로서 DK 보드위의 4개의 LED에 순서대로 불을 키게 한다.)
위치 : nRF5_SDK_xxx\examples\peripheral\blinky\pca10028\s130\arm5_no_packs\blinky_s130_pca10028.uvprojx 을 실행시키자. 그럼 Pack Installer가 실행되면서 각종 필요한 pack들을 설치하는데 모두 ok하면 된다.(설치하는데 길게는 15분 정도 걸리는 듯 하다.)
3) blink 프로젝트를 컴파일한 후, DK 보드에 프로그래밍 하자.
(1.이 컴파일이고(F7) 2.이 DK보드에 업로드 하는 버튼(F8))

-> 위 과정이 끝나면 4개의 LED에 불빛이 순서대로 들어올 것이다!!
예제파일 내에 있는 코드들은 다음 포스트에서 설명하겠습니당.

nRF51 개발환경 구축

개발환경 구축을 위해 다양한 tool들을 설치 해야한다.
nRF51 DK user guide를 보시면 어떤 툴을 설치하고 어떻게 설치할 지 나와 있다.
링크 : http://infocenter.nordicsemi.com/pdf/nRF51_DK_UG_v1.1.pdf (page 7을 바로 보면 nRFgo studio, Keil MDK, latest SDK 을 설치하라고 나와 있다.)

하지만!! 위 유저가이드에서 제공하는 링크를 따라가면 설치할 수 없다..
그래서 올바른 링크를 제공하겠다.

1. nRFgo studio https://www.nordicsemi.com/eng/Products/nRF51-DK/%28language%29/eng-GB 여기서 OVERVIEW 탭과 DOWNLOADS 탭이 있는데 DOWNLOADS 탭에 들어가면

거의 맨아래에 이런게 있는데
nRFgo Studio-Win32Software tool for nRFgo Starter Kit and Development Kits for 32-bit (x86) Windows XP, Windows Vista, Windows 7, and Windows 81.21.2
nRFgo Studio-Win64Software tool for nRFgo Starter Kit and Development Kits for 64-bit (x64) Windows Vista, Windows 7, and Windows 81.21.2
여기에서 window 버전에 맞게 설치하면 된다. 설치하다 보면 추가로 command line tools를 설치하는 항목이 뜨는데 무조건 받아야한다.

여기서 해당 정보들을 꽉꽉 채워서 submit 하면 설치파일을 제공해준다.

여기가서 원하는 버전의 sdk를 받으면 된다. 단 최신 SDK는 인터넷에 자료들이 없어 v11.x.x를 받는 걸 추천한다.

4.MCP : 요건 nordic사에서 제공해주는 튜토리얼을 따라가다 보면 설치하라고 한다. 그러나 이 프로그램의 용도는 단순히 BLE 데이터를 pc에서 잡게끔 도와주는 프로그램이므로 필수는 아니다. 차라리 이거 쓸바에 핸드폰 어플을 쓰는게 훨씬 낫다.

5. nRF Toolbox( for app) : playstore 나 appstore에 가서 nRF toolbox를 검색하면 나오는 걸 받으면된다. 이 어플은 BLE를 통해 구현한 애플리케이션을 테스트 해주는 어플이다. 추가로 nRF beacon, nRF connect 어플도 받아두면 좋다.

다음 포스트에서는 SDK 내에 있는 예제 프로젝트를 돌려보겠다.

nRF51 Development Kit 을 이용한 블루투스 구현 프로젝트

블루투스를 이용해서 원거리로 데이터들을 보낼 수 있다. 
그러나 요즘 나오는 IoT 라던지 헬스케어등 애플리케이션에서 사용하는 블루투스는 해당 유형 별로 블루투스 프로토콜을 커스터마이징 해야 할 필요가 있다.(블루투스로 보내는 회사 이름, 데이터 구조, 데이터 내용, 송신 주기, 수신 주기 등등..)
그러기 위해서는 firmware를 수정해야 하는데 가장 널리 쓰이는 칩이 바로 nordic 사의 nRF5 시리즈 이다. 이 회사에서 다양한 모듈로써(동글이나 smart beacon kit 등등) 칩을 제공 하는데 처음 시작하기에 가장 좋은 모듈은 nRF51 Development Kit이다.(칩으로 바로 firmware을 업로드하기 편리하며 kit 내에 LED나 Switch를 바로 사용할 수 있어 좋다.) 

앞으로 다음의 순서로 nRF51 DK 사용법 튜토리얼을 진행해 봅시다.

1. 개발환경 구축
2. nRF 칩의 구조
3. 간단한 예제 파일 실행
4. 간단한 bluetooth 예제 파일 실행 및 BLE 구조

위의 내용을 따라가면서 동시에 nordic사에서 제공해주는 자료들을 함께 봐주면 더욱 더 빨리 따라올 수 있다. 그치만 자료들이 여러 웹페이지에 뿔뿔이 흩어져 있어 이 글에 모아 정리 하겠다.

Reference

QnA(stackoverflow같은 페이지) : https://devzone.nordicsemi.com/questions/
SDK의 예제에 나오는 함수나 API의 정의가 설명되있는 페이지 : http://infocenter.nordicsemi.com/index.jsp
BLE 구조에 대해 설명하고 nRF 칩에서는 그 구조를 어떻게 구현하는지.. : https://devzone.nordicsemi.com/tutorials/37/

위 참고자료와 여기에 올라올 글들을 같이 참고해주면 좋겠다.

2017년 7월 27일 목요일

win32 api 시작하기

 c, c++를 배우고 나니 직접 응용프로그램을 만들고 싶어졌다. c++언어로 프로그램을 만들 수 있는 애플리케이션이 win32 api와 MFC가 있어서 뭘 배워야 할지 고민했다. MFC가 좀 더 세련된 툴을 제공하는 것 같아 보였지만 많이 복잡해 보여서 열심히 구글링을 해본 결과 아주 자세히 설명된 블로그를 찾을 수 있었다.

 링크 여기에 들어가보면 응용 프로그램 개발에 대한 커리큘럼(?)이 이해되기 쉽게 나와 있으니 참고해보자!

 위의 글에서 win32 api를 먼저 배워 윈도우 메시지에 대한 전반적인 이해를 하고 MFC를 시작하면 좋다고 한다.  SoEn:소프트웨어 공학 연구소 여기에 win32 api에 대한 기초강의가 잘 설명돼 있으니 굳이 책을 사지 말고 무료로 기초를 다져 봅시다.


1. 프로젝트 만들기

1. visual studio 에 들어가 새 프로젝트를 누른다.


2. 다음

3.

위의 과정으로 win 32 api 개발을 위한 프로젝트 환경이 모두 준비됐다.


2. 빈 창을 띄우는 코드 실행하기  


1. 소스 파일에 새 항목을 추가하여 main.cpp 파일을 만들자!

2. 추가된 메인 파일에 아래 코드를 복붙 하면 완료!!!

빈 창을 띄우는 winapi 코드 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="First";
 
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;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    switch(iMessage) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs



3. 에러 잡기!


위의 코드를 컴파일 하면 되부분 될 텐데 안되는 사람도 있을 거다.
error C2440: '=' : 'LPSTR'에서 'LPCWSTR'(으)로 변환할 수 없습니다.
error C2664: 'CreateWindowExW' : 매개 변수 2을(를) 'LPSTR'에서 'LPCWSTR'(으)로 변환할 수 없습니다.

위와 같은 에러가 뜨면서 안되는 사람들은 아래와 같은 방법으로 해결 할 수 있다.

1. 프로젝트 속성에 들어가기

2. 구성속성/일반/문자 집합 항목에서 "멀티바이트  문자 집합 사용" 을 선택한다.

3. 구성속성/링커/중분 링크 사용 항목에서 "아니요" 를 선택한다.


오류 해결 끝~~

다음에는 win32 api를 통해 메모장을 제어하는 것을 구현해보자!