[펌: http://blog.naver.com/hsshee?Redirect=Log&logNo=70037637328]


간혹 어떤 프로그램에서 LoadLibrary와 GetProcAddress API를 사용하여,

어떤 dll 내의 함수를 사용하는 경우가 있다.

 

LoadLibrary와 GetProcAddress의 원형을 살펴보자.

 

◈ HMODULE LoadLibrary( LPCTSTR lpFileName );

> 인자로 준 DLL을 현재 프로세스의 주소공간으로 mapping 시켜서 사용할 수 있도록 해주는 API.

 

◈ FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

> DLL에서 Export한 함수의 번지를 찾아서 그 함수를 사용할 수 있도록 그 함수의 포인터를 리턴해 주는 API.

 

 

1. DLL 내의 함수를 사용하기 위해서는,

먼저 LoadLibrary를 이용하여 DLL의 모듈 핸들을 리턴 받는다.

( HMODULE or HINSTANCE와 같은 핸들을 통해 리턴받으면 된다. )

 

인자는 DLL의 경로를 문자열로 넘겨주면 되고, 끝에 널문자가 있어야 한다는 걸 잊지 말자.

 

참고로, 반드시 리턴된 모듈 핸들이 NULL이 아닌지를 체크하는 습관을 들이도록 하자.

 

 

2. 유효한 모듈 핸들을 가지고,

GetProcAddress를 이용하여 DLL에서 Export한 함수를 가져오자.

 

이 때의 인자는 LoadLibrary를 통해서 리턴 받은 모듈 핸들과

그 DLL 내에서 사용하기 원하는 함수의 이름을 문자열로 넘겨준다. 이 때에도 끝에 널문자가 있어야 한다.

 

GetProcAddress를 수행하면 프로그램에서 선언한 함수포인터 변수에

DLL에서 Export한 함수의 주소가 리턴되어 이 프로그램에서 선언한 변수를 통하여

DLL 내의 해당 함수를 사용할 수 있게 되는 것이다.

 

만약에 인자가 정확하게 들어가지 않았다면, 역시 NULL이 리턴된다.

 

 

3. LoadLibrary와 같이 모듈 핸들을 받아서 DLL을 사용하였을 경우,

FreeLibrary API를 이용하는 습관을 들이도록 하자.

 

◈ BOOL FreeLibrary(HMODULE hLibModule);

>해당 DLL의 사용 카운트를 1 감소시키고 사용 카운트가 0이 되었을 때에 메모리에서 해당 DLL을 삭제해준다.

   리턴형은 BOOL인데, 이 때에 DLL을 삭제하는 데에 성공했다면 TRUE를, 실패했다면 FALSE를 리턴하는 것이다.

 
4. GetProcAddress에서 NULL이 리턴되는 경우 중,

Name Mangling으로 인한 경우가 있다. 이 때의 해결책은 다음과 같다.

 

DLL 프로그래밍한 프로젝트에서 export하는 함수를 선언하는 헤더에 다음과 같이 추가하여 Rebuild하면 된다.

 

 cpp dll 을 c type으로 바꿔주는 코드

 

#ifdef __cplusplus
extern "C"
{
#endif

 

// export할 함수

 

#ifdef __cplusplus
}
#endif

 

 

어떤 함수를 위의 코드를 이용하지 않고 빌드한 경우와 위의 코드를 추가하여 빌드한 경우에

각각의 dll파일을 Peview를 통하여 어떻게 함수명이 저장되는지 확인해보자.

 

원하는 함수명은 GetOpcodeFirstByte이다.

 

1) 위의 코드를 이용하지 않고 빌드한 경우,

 

2) 위의 코드를 추가하여 빌드한 경우,

 

1)의 경우에 GetProcAddress에서 Export할 함수의 문자열을 "GetOpcodeFisrtByte"로 넘겨주면,

실제 dll의 export된 함수명과 다르기 때문에 NULL이 리턴된다.

 

※ 위의 코드를 추가하는 습관을 들이도록 하자.

'NativeCode > api' 카테고리의 다른 글

printf, scanf 함수 포맷 문자열  (0) 2010.07.07
IP, TCP, UDP, ICMP Checksum 계산  (0) 2010.07.05
IpHlpApi MSDN  (0) 2010.07.04
SendARP  (0) 2010.07.03
[팁] Heap 메모리 검증하기.. | VC++ 일반  (0) 2010.05.09
이미 정의되어 있습니다. 무시
/FORCE:MULTIPLE


Bloger : moltak.net
안녕하세요. moltak 입니다. 
우연히 "공부하는 독종이 살아남는다"라는 책을 볼 기회가 생겨서 일거 봤는데 매우 좋네요. ㅋㅋ
그 부분에서 가장 기억에 남는 또 바로 도움이 될 만한 챕터를 요약해 봤습니다. 


[공부하는 독종이 살아남는다.]
[정신과 전문의 이시형 박사 지음: 중앙 books]


1) 몸과 마음을 준비시키는 집중의 비법
-> 내게 맞는 곳에서 책을 펼쳐라 : 넓고 개방된 곳 보다는 적당한 크기의 폐쇄된 공간이 좋다. 너무 조용하면 정서적으로 안정이 안될 수 도 있다. 음악을 틀되 평소에 자주 듣거나 아주 좋아하는 음악은 피하는 게 좋다. 
-> 주변 환경이 조성되었으면 크게 심호흡을 해 보자. 바른 자세로 앉아 숨을 깊이 들이마시고 내쉬는 동안 우리 뇌에서는 세로토닌이 분비된다. 그 1분간의 명상으로도 뇌는 충분히 공부 준비를 한다. 공부 시작 전 학교 다닐 때 수업이 시작되기 전 반장이 일어나 '차렷, 경례' 하는 것처럼  '시작!' 이라고 기합을 외쳐보자.
-> 이제  책을 펴고 오늘의 목표를 정해라. : '몇 시까지 두 챕터를 읽겠다', '오늘 중으로 단어 50개를 위우겠다. 하는 식으로 구체적인 목표를 정해라.
-> 꾀가 나거든 하품을 하거나 기지개를 켜라. 각성 중추가 자극되어 가뿐한 기분이 든다. 그래도 집중이 흐트러지면 일어나라. 서있기만 해도 100개 근육이 이완과 긴장을 반복하여 뇌를 자극한다. 창문을 열고 방 안을 걷거나, 소리내어 읽어라. 찬물로 세수 하거나 '짝!' 소리가 나게 박수를 쳐라. 정 피로감이 심해지면 아예 큰대자로 누워라. 5분 정도 누워있는 것이 최고의 피로 회복제다.
-> 이렇게 온몸을 움직여서 머리를 쉬게 하자. 단 이 시간은 딱 10분이다. 10분이 넘으면 공부에의 뇌 회로 활성도가 차츰 떨어지기 시작한다.

2) 초고도 집중력을 기르는 일점 집중의 비법
-> '버리는 것'에서 시작한다. 이것도 저것도 다 하려면 안된다. 일단 여기다 싶으면 오직 여기에만 전력투구 하라. 렌즈의 초점이 두셋이 되면 불이 붙지 않는다.
-> 집중의 대상이 단순 명쾌해야 한다. '이번 시간에 단어 20개는 외운다' 처럼 구체적이고 실질적이어야 한다.
-> 전체를 개관해야 한다. 앞으로 남은 시간, 분량, 내 실력등 전체적인 판단이 서야 버릴 건 버리고 한점에 집중 할 수 있다. '이 시간엔 이것만 하면 된다'는 안심감이 집중을 잘할 수 있게 해준다.
-> 전체적인 흐름에서 감당할 만큼의 부하를 걸어야 한다. 처음 하는 공부라면 적정한 양을 마스터함으로써 달성감, 자신감을 얻을 수 있다. 하지만 차츰 그 수준을 넘어, 자기 허용 범위까지 넘어야 한꼐를 돌파할 수 있다.

3) 생각과 감정을 깔끔하게 정리하는 순간 전환의 비법
공부와 상관없는 생각과 감정은 학슴을 방해한다. 지금 하고 있는 것이나 앞으로 해야 할 것과 관련이 없는 생각은 다른 상자에 넣어 뚜껑을 닫아야 한다. 그리고 새로운 생각을 담을 상자의 뚜껑을 연다.
이것을 순간 전화의 기술, 컴파트먼트(Compartment)라고 한다. 
지금 하는 공부에 집중할 때 는 그 전에 한 공부는 잊어버리게 되어 있다. 그래야 지금 공부에 집중할 수 있기 때문이다. 둘 다 하려면 어느 것 하나도 잘 안 된다. 지금 하는 공부에만 집중해라. 그 전 것은 과감히 잊어도 된다. 잊어버린 것은 다음에 또 하면 된다.

4) 하루를 48시간 처럼 쓰는 시간 창출의 비법
-> 뇌과학에서 추천하는 가장 간단하고 효과적인 시간 창출의 방법은 아침 일찍 일어나는 것이다. 성공적인 인생을 살고 싶다면 잠은 6시간이면 충분하다. 그리고 점심 식사 후 15~20분간 낮잠을 자 두자.
-> 미리 공부 시간을 정해 놨다면 그 시간에 딱 책상 앞에 앉아라. 미루지 말고 당장 시작해라.

5) 긴장과 이완을 적절히 조화시키는 휴식의 비법
-> 하룻밤 8시간의 수면은 90분 단위로 5주기가 진행된다. 밤잠은 짧게, 그러나 6시간은 자되 낮잠을 자라.

6) 필요한 공부 정보만 골라 담는 정보 습득의 기술
-> 대충 읽기: 많이 읽는 것이 중요한게 아니라 핵심을 내 것으로 만드는 일이 중요하다. 대충 훑어보다가 어려운 부분은 건너뛴다. 시간은 없다. 중요하다가 생각되는 부분만 자세히 읽자.
-> 밑줄 그으며 읽기: 책은 아껴 보는 것이 아니다. 특히 공부용 책은 깨끗해서는 안 된다. 밑줄과 네모로 지저분한 책은 그만큼 열심히 공부했다는 증거다.
-> 저자와 토론하며 읽기: 내 기존 지시을 동원해 비판, 보완하고 새로 편집, 요약한 걸 선택적으로 입력해 기억 창고에 저장해 두어야 한다. 이게 크리에티브 리딩(Creative Reading), 크리에이티브 리스닝(Creative Listening), 창조적 입력이다.

->메모하며 읽기: 읽다 보면 뇌가 자극받아 여러 가지 생각이 고구마 줄기처럼 떠오를 때가 있다. 그 생각들을 여백에 가볍게 적어 둔다.

-> 다시 읽기: 꼼꼼하게 한 번 읽는 것보다 여러 번 읽는 것이 학습에는 더 효과적이다.



7) 잊거나 깜빡하지 않게 하는 정보 기억의 기술
-> 온몸을 동원해 기억하라: 프로이트는 라틴어와 그리스어를 공부하면서 단어를 외울 때 손으로 벽을 두드리며 온 집안을 돌아다녔다고 한다. 감각 기관이 많이 동원될수록 뇌의 활성화 범위는 넓어진다. 눈으로만 읽을 때는 시각야만 자극되지만, 온몸 학습법은 뇌의 활동 범위가 넓어져 활성도를 높인다. 공부할 때 기억의 저장고가 활짝 열리도록 온몸으로 뇌를 자극하자.
책을 읽을 때는 소리 내 읽어라. 암창법(暗唱法)은 옛날 서당에서 사용하던 학습법이다. 가급적 자극을 활용하는 것이 기억의 정착률을 높인다.

-> 기억과 감정을 연계해 기억하라: 기억과 본능이 바탕이 된 즉각적인 판단을 뇌과학에서는 감정 기억이라 한다.

-> 먹으며 기억하라: 공부할 때 커피를 적당히 마셔보자. 커피는 도파민 신경을 자극하고 알파파를 형성한다. 콩과 두부요리에는 뇌 세포의 주요 성분인 레시틴이 풍부하다. 레시틴은 뇌 신경 세포를 활성화시켜 머리 회전을 빠르게 해 주는 것으로 알려져 있다. 레시틴은 호두, 잣 등의 견과류에도 다량 함유되어 있어 공부할 때 간식거리로 좋다.

-> ‘끊어 가기’로 기억하라 : 공부가 힘든 이유 중 하나는 기억의 간섭 때문이다. 무언가를 기억하려고 할 때 그 전의 기억이 새 기억을 못하게 방해하는 현상이다. 혹은 새 기억이 들어옴으로써 그 전에 겨우 익혀 놓은 기억이 약해지고 흔들리기도 한다. 학술적으로는 이를 기억 억제 또는 간섭이라고 부른다. 이 현상이 발생하면 진도가 잘 나가지 않고 머리가 복잡해진다. 이럴 때는 공부를 잠깐 끊고 머리를 식혀야 한다. 머릿속에 이런 형상이 계속되면 실제로 뇌 속의 열이 오른다. 뇌는 체열보다 조금 낮은 온도에서 잘 돌아가기 때문에 찬바람이나 찬물로 식혀라.

-> 전체 맥락을 먼저 이해하라: 공부할 내용을 이해해야 공부할 부분에 체계가 선다. 공부의 체계를 잡는 것을 전문 용어로는 기준계라고 하는데, 계통적인 틀을 만든다는 뜻이다. 이해한 후 전체의 틀이 잡히면 절로 메모리 트리(Memory Tree)가 그려진다. 이 후의 단계는 복습이다.

-> 세 단계 복습으로 기억하라: 기억을 다지는 작업은 기억 후 수시간 내에 하는 것이 가장 효율적이며, 그 후엔 1일, 1주, 그리고 1개월의 사이를 두고 복습하는 것이 좋다.

8) 필요할 때마다 쏙쏙 꺼내 쓰는 정보 활용의 기술
-> 기억을 그루핑(Grouping) 한다 : 핵심을 최상위에 놓고 그 하위 개념으로 연관된 것들을 묶어 보자. 단어를 외울 때 기본형으로 기억의 틀을 잡자.

-> 디테일은 신뢰할 수 있는 자료로 따로 정리한다: 일단 개략적인 내용을 확실하게 잡고 디테일의 정보는 굳이 외우려고 노력하지 말자. 굳이 기억하지 않아도 공부에 큰 지장이 없는 디테일 정보들은 따로 메모를 해 놓거나 노트를 만들어 두는 것도 좋다. 필요할 때 언제든 꺼내 볼 수 있도록.

-> 장기 보관이 필요없는 정보는 과감히 삭제한다: 



Bloger : moltak.net

'날 살아가게 하는 것들 > 그냥 쉬자' 카테고리의 다른 글

수원생활  (0) 2012.03.11
Out of the Box  (0) 2011.03.08
이매진컵!! 자랑자랑..  (0) 2010.05.29
아아아아악  (0) 2010.05.08
CodeEngn Basic 완료  (2) 2010.04.28

+ Recent posts