핸들이란 구조는 운영체제에서 제공하는 리소스를 제공하기 위해 사용하는데, 마우스 커서, 색깔, 메모장같은 프로그램의 디자인같은 것들의 프로그램의 함수도 어딘가의 메모리에 저장되어 있을 것이다. 콜백함수처럼 라이브러리 프로그래머들이 소스는 보여주기 싫고 대신 적절한 어딘가에 함수포인터를 집어넣어서 너희가 필요한 함수를 만들어서 내가 라이브러리 함수안에 있는 함수포인터에 집어넣어 사용하라라고 하는 구조가 '콜백함수'인데, 운영체제에서 이런 콜백함수를 사용하게 되면 포인터로 그 메모리의 주소를 알게 되어 그 메모리에 직접 접근할 수 있고 그렇게 되면 다양한 오류가 나기 때문에.. Window OS에서는 메모리주소대신 HANDLE값이라는 정수값을 대신 준다. 해서 그 HANDLE값으로 다양한 리소스를 사용할 수 있는 것이다.
과정 :프로그래머->API->리소스->메모리를 핸들 정수값으로 만듬->핸들값을 API에 전달->프로그래머 사용
#include "pch.h"
#include <iostream>
#include <string.h>
#include <memory.h>
using namespace std;
typedef unsigned int HANDLE;
struct HandleData
{
HANDLE h;
char* p_string;
};
class HandleManager
{
private:
unsigned int m_max_count;
HANDLE m_gen_value;
HandleData* mp_data;
public:
HandleManager(unsigned int a_max_count = 50)
{
m_gen_value = 1;
m_max_count = a_max_count;
mp_data = new HandleData[m_max_count];
}
~HandleManager()
{
HandleData* p = mp_data;
for (unsigned i = 0; i < m_max_count; i++) {
if (p->h)delete[] p->p_string;
p++;
}
delete mp_data;
}
HANDLE InsertSpring(const char* ah_string)
{
HandleData* p = mp_data;
unsigned int i;
for (i = 0; i < m_max_count; i++) {
if (p->h)break;
p++;
}
if (i < m_max_count) {
unsigned int len = strlen(ah_string) + 1;
memcpy(p->p_string, ah_string, sizeof(len));
p->h = m_gen_value++;
}
cout << "핸들의 저장공간이 충분하지 않습니다." << endl;
return 0xFFFFFFFF;
}
void PrintString(const HANDLE a_value)
{
HandleData* p = mp_data;
for (unsigned int i = 0; i < m_max_count; i++) {
if (p->h == a_value) cout << p->p_string << endl;
p++;
}
cout << "유효하지 않은 핸들 값입니다." << endl;
}
void DeleteString(const HANDLE a_value)
{
HandleData* p = mp_data;
for (unsigned int i = 0; i < m_max_count; i++) {
if (p->h == a_value) {
cout << p->p_string <<" : 삭제"<< endl;
delete[]p->p_string;
p->h = 0;
}
p++;
}
cout << "유효하지 않은 핸들 값입니다." << endl;
}
};
int main()
{
HANDLE h_value;
HandleData h_data;
HandleManager str_list;
h_value = str_list.InsertSpring("HI~");
if (h_value != 0xFFFFFFFF) {
str_list.PrintString(h_value);
str_list.DeleteString(h_value);
}
str_list.PrintString(h_value);
return 0;
}
'MFC' 카테고리의 다른 글
Brush Handle값 받아서 테두리없는 사각형패턴 (0) | 2020.09.09 |
---|---|
Pen Handle값 받아서 Pen이나 Brush 다르게 그리는 것 (0) | 2020.09.09 |
BitBlt,WM_CLOSE (0) | 2020.09.07 |
마우스로 사각형 움직이기 (0) | 2020.09.06 |
선그리기 (0) | 2020.09.05 |
댓글