|
안녕하세요 heredity입니다.
GetProcAddress()에서 반환되는 FARPROC형 값(pointer 값이죠)을
정수형 인수 2개를 갖고 처리 결과로 int형을 return하는 함수형 pointer로 변환하는 겁니다.
이 변환은 GetProcAddress()가 하는 것이 아니라 C++ Compiler가 실행 코드를 만들때
GetProcAddress()를 호출한 후 그 결과 값을 이런 형태로 변환하라 라고 넣어둔 코드에서
하는 겁니다.
다음은 정수형 변수를 이용한 함수 호출에 대한 간단한 예를 보이겠습니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int nFunc1;
//---------------------------------------------------------------------------
void Put1( AnsiString asStr )
{
Form1->Memo1->Lines->Add( asStr );
}
//---------------------------------------------------------------------------
void Put2( PCHAR pchStr, int nNo )
{
AnsiString asStr = pchStr;
asStr.sprintf( "%s %d", pchStr, nNo ); // pchStr이 NULL인지 비교하지 않았음.
Form1->Memo1->Lines->Add( asStr );
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
// 아래 두줄은 일반 호출 형태입니다.
Put1( "Put1" );
Put2( "Put2", 123 );
// 이것을 정수형 변수를 이용해 호출해 보겠습니다.
// 함수 Put1의 시작 주소를 정수로 바꾼한 정수형 변수 nFunc1에 보관함.
nFunc1 = (int) Put1;
// 함수 주소 2 - 함수주소 1를 계산했습니다.
int nAdd = (int) Put2 - (int) Put1;
// nFunc1 + nAdd2의 값을
// AnsiString형과 Int형 인수를 갖고 return 형이 없는 함수형태로 변환한 후
// 인수를 대입한 후 nFunc1 + nAdd2가 가리키는 주소를 호출합니다.
// 이 주소가 어디일까요? 정답은 실행 결과로 확인해 봅시다.
((void (*) (PCHAR, int)) (nFunc1 + nAdd))( "Int_Put2", 456 );
// 위에 내용을 이해 했다면 아래 내용은 더욱 쉽습니다.
nFunc1 = (int) Put1;
((void (*) (AnsiString)) nFunc1)( "Int_Put1" );
}
< 실행결과 >
Put1
Put2 123
Int_Put2 456
Int_Put1
어떠세요? 꼭 Pointer형 변수에 넣지 않아도 알맞게 형변환하면 유사하게 사용할 수
있다는 것이 확인 됐죠?
하지만 위의 코드는 결코 보기 좋지가 않습니다. 하는 일은 위의 코드나 아래 코드나
똑같은데 굳이 아래 형태로 작성하여 보기 힘들게 만들 필요가 없겠죠!
가급적 보기 쉽게, 이해하기 쉽게 만드는 것이 추후 유지 비용을 줄일 수 있으므로
꼭 필요한 경우가 아니라면 가급적 보기 쉬운 형태로 작성하시기 바랍니다.
^_^;;
행복하세요.
--------------------------------------------------
김광수 님이 쓰신 글 :
: int (*pFunc) (int,int);
:
:
:
: hInst=LoadLibrary("MyDll.dll");
:
:
:
: pFunc=(int (*)(int,int))GetProcAddress(hInst, "AddInteger");
:
:
:
: 여기서 (int (*)(int,int)) 이렇게 형변환을 하는대 왜 이렇게 해줘야 되는지 궁금합니다..
:
: 참 이상해 보입니다.
:
:
:
: 왜 저렇게 하면 인수두개를 가지고 정수형을 가지는 함수 포인터가 반환되는지 메카니즘을 알고싶습니다.
:
|