Win32 Dyanmic Library
프로젝트 명 Win32
A simple DLL project 선택하면 다음 함수가 하나 생김
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
--------------------------------------------------
DllMain 함수 호출되면 어떤 이유( ul_reason_for_call)에서 호출되었냐?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH : //타 프로세스에 붙을 때
case DLL_PROCESS_DETACH : //사용중이던 프로세스에서 떨어질 때
}
return TRUE;
}
--------------------------
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{//어느 프로세스에서 사용되는지를 감지할 수 있다....
case DLL_PROCESS_ATTACH : //타 프로세스에 붙을 때
MessageBox(NULL, "나 사용하려구");
break;
case DLL_PROCESS_DETACH : //사용중이던 프로세스에서 떨어질 때
MessageBox(NULL, "다 사용했다.");
break;
}
return TRUE;
}
int Add(int a, int b)
{
return a+b;
}
int Sub(int a, int b)
{
return a-b;
}
int Mul(int a, int b)
{
return a*b;
}
int Div(int a, int b)
{
return b==0 ? 0 : (a/b);
}
F7로 실행
//네개의 함수를 사용하게끔 해야 한다. 텍스트 파일 만듬
Win32.def <-디피니션 파일이고 여기서 주석문은 ;
;외부에서 사용할 수 있겠끔 Export 설정
EXPORTS
Add
Sub
Mul
Div
-----------------------------------------------------
LIBRARY "Win32.dll"
여기까지 쓰면
Win32.dll에 있는 함수들을 사용하겠다...
-----------------------------------------------------
Creating library Debug/Win32.lib and object Debug/Win32.exp
가 생성됨
------------------
여기서 생성된 DLL 가져다 쓰기
WIn32_Test 프로젝트를 Dialg Base로 만든다.
/(int *)(int, int) => (int *Plus)(int, int)
//typedef int(*MYCALC)(int, int) MYCALC(int, int)
int Add(int a, int b)
----------------------------------
//DLL 참조 순서..
//1. 현재 P/G 2. Path
void CWin32_TestDlg::OnButtonPlus()
{
}
------------
2. Path
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\Program Files\ESTsoft\ALZip\;C:\Program Files\ESTsoft\ALZip\
위 디렉토리 어디에 갔다 놓아도 됨
------------
1. 사용하려면
dll파일을 WIn32_Test 디렉토리에 저장해 두고
Project/Setting에 가서 exe파일이 debug에 만들어지는 것을
현재 소스 파일이 있는 위치로 변경
--------------
//외부에서 export 설정해야 함수의 포인터를 구할 수 있음
//즉, Definition 파일을 반드시 작성해야 한다.
//함수 형 선언하기
typedef int (*MYCALC)(int, int);
void CWin32_TestDlg::OnButtonPlus()
{
//DLL 참조 순서..
//1. 현재 P/G 2. Path
/* 명시적 사용법: 리턴값이 모듈 핸들 값...
HINSTANCE hInst=LoadLibrary("Win32.dll"); //현재 프로시저에 모듈을 올려놓구
GetProcAddress(HINSTANCE, 함수명); //사용한 후
FreeLibrary(hInst); //다시 내려놓는다. 결국 DLLMain이 두번 호출된다.
*/
UpdateData();
HINSTANCE hInst=LoadLibrary("Win32.dll");
MYCALC plus=(MYCALC)GetProcAddress(hInst, "Add");
m_su3 = plus(m_su1, m_su2);
UpdateData(0);
FreeLibrary(hInst);
}
1. Win32.dll 모듈를 메모리에 올리고 그 것을 핸들로 제어한다. 그 핸들이 함수의 리턴값으로 되돌아 온다.
HINSTANCE hInst=LoadLibrary("Win32.dll");
2. 모듈내의 함수가 있는데 그 함수가 몇 번지에 있는지를 알려주는 함수가...
MYCALC plus=(MYCALC)GetProcAddress(hInst, "Add");
3. 함수를 호출한다는 것은 그 함수가 존재하는 주소로 이동하는 셈이다.
그리므로 2번에서 구한 함수의 주소값인 plus로 함수를 호출할 수 있다.
m_su3 = plus(m_su1, m_su2);
4. 다 사용하였다면 띄어 놓는다.
FreeLibrary(hInst);