|
안녕하세요. GetProcAddress는 myDll.dll에서 AddInteger라는 함수를 찾아 그 함수의 주소를 리턴해주는 일을 합니다. 함수가 실행된다는것은 call 명령에 의해 그 함수가 위치한 메모리 주소로 점프하는 것을 말합니다. 따라서 함수도 메모리 주소값 즉, 포인터입니다.
김광수님의 코드의 제일 위에서 int형의 인자를 두개 받으며 리턴값이 int를 가진다고 int (*pFunc) (int, int) 로 함수의 형식을 선언했습니다. 앞서 설명드렸듯이 함수도 주소값이므로 *pFunc 포인터로 받습니다.
이제 GetProcAddress 함수가 호출되면 AddInteger의 위치를 찾아 그 위치에 해당하는 메모리 값을 리턴합니다. 이 리턴된 메모리 주소 값을 pFunc가 가리키게 해야 하는데 pFunc에 넣기전에 이 리턴값을 pFunc 함수의 주소라는 의미로 (int (*)(int, int))를 통해 컴파일러에게 알려주는것입니다. 복잡해 보이지만 의미는 char ch = (char) b; 와 같은 형변환입니다. 이것을 typedef를 써서 바꾸면 아래와 같이 됩니다.
typedef int _declspec(dllimport)Define_Of_pFunc(int, int);
Define_Of_pFunc *pFunc;
pFunc = (Define_Of_pFunc *) GetProcAddress(hInst, "AddInteger");
typedef를 사용한 방법을 이전에 사용했던 방법과 비교해 보시면 이해가 되실것입니다.
김광수 님이 쓰신 글 :
: int (*pFunc) (int,int);
:
:
:
: hInst=LoadLibrary("MyDll.dll");
:
:
:
: pFunc=(int (*)(int,int))GetProcAddress(hInst, "AddInteger");
:
:
:
: 여기서 (int (*)(int,int)) 이렇게 형변환을 하는대 왜 이렇게 해줘야 되는지 궁금합니다..
:
: 참 이상해 보입니다.
:
:
:
: 왜 저렇게 하면 인수두개를 가지고 정수형을 가지는 함수 포인터가 반환되는지 메카니즘을 알고싶습니다.
:
|