Win api를 이용한 gui 개발

자료조사/리버싱, 시스템 2015. 7. 16. 17:24

윈도우 창을 하나 띄우고 두개의 버튼에 하나는 메세지박스, 하나는 계산기를 띄우는 과제


api를 공부하면서 어려웠던 점은 api만이 가지는 독특한 자료형들이 많다는 점과 그 자료형들 사이에 호환이 잘 안된다는 점이었다.

그부분에 관한 내용을 정리하자면.


1.과거 win32 api에서 쓰던 LPCSTR과 LPCWSTR이 호환이 되지 않는 경우, char 또는 const char와 wchar_t가 호환이 되지 않는 문제가 있었다.


프로젝트 우클릭 , 속성에서 멀티바이트 문자열 사용으로 대부분 해결할 수 있는 것 같다.

하지만 어째서인지 내 개발환경에서는 실패..


과거의 책이나 블로그에 있는 내용들은 CreateWindow 등 함수에서 LPCSTR자료형을 상정하고 쓰여져 있는 듯 하다. 때문에 실제 LPCWSTR을 사용하는 개발환경에서 호환이 되지 않는 경우가 많았다.


변수를 선언할 때 LPCWSTR로 바꿔주고 ""안에 들어있는 const char 앞에 L 매크로를 붙여 쉽게 LPCWSTR로 변환할 수 있었다.


//LPCWSTR과 wchar_t는 비슷한 개념인 것 같다.



두번째로 발생한 문제는 계산식들과 정답 역시 double, int, char등 여러가지 형태로 나누어져 있는데 TextOut함수를 이용하여 출력하기 위해서는 이들을 모두 LPCWSTR형태로 바꾸어줘야 하는 문제였다.


itoa, strcat을 이용하여 계산식을 문자열 형태로 묶는것은 간단하게 해결이 되었으나 여기서부터가 더 끔찍했다.


mbstowcs함수는 const char* -> LPCWSTR형태밖에 지원하지 않는다. 사실 char* 형태를 넣어도 에러가 나지는 않는다. 그래서 그냥 사용하려고 했는데... TextOut을 이용해 출력한 녀석을 지우기 위해 새로운 char*을 이용하자 문제가 일어났다. 스텍이 오염되었다는 것이다. 한번은 되고 왜 두번은 안되는가... 아무튼 char*형 변수에 들어가 있는 문자열을 LPCWSTR로 바꾸는 방법을 몰라 한참을 막혀있었다.


결론부터 얘기하자면 저 문제에 대한 해결방법은 찾지 못했다. 대신 두번째 사용할 char*형태의 녀석이 clear라는 스페이스만 백개가 들어가는 녀석이라 눈물을 머금고 memset을 이용한 초기화를 포기하고 L"  ..."의 방식으로 const char* clear를 선언하여 해결했다.


왜 mbstowcs에 char*형태를 쓰면 스텍이 망가지는지, 왜 하필 두번 쓰면 그때부터 망가지는지 그부분은 결국 알아내지 못했다...


2.핸들 DC에 관한 부분을 거의 이해하지 못했다.


사람들이 써놓은 코드를 가져다 쓰다보니 구조적인 부분에 있어서 많이 미숙한 것 같다.


결론은 api 코딩에 관해서도 많은 공부가 필요한듯.

'자료조사 > 리버싱, 시스템' 카테고리의 다른 글

dll injection 추가  (0) 2015.07.25
dll injection 조사 3.  (0) 2015.07.23
dll injection 조사 2  (0) 2015.07.23
dll injection 조사 1  (0) 2015.07.22
Tags
Social