출처가 정확히 어딘지는 모르겠지만 잘정리 되어 있어서 올려봅니다.
멤버 함수의 포인터는 포인터라 할 수 없습니다.
일종의 오프셋 개념으로 사용해서 포인터를 계산하게 됩니다.
static이 아닌 멤버함수는 __thiscall 규약을 따릅니다.
멤버 함수를 static 함수로 만들어주면 __cdecl 규약이 되어 잘 컴파일될겁니다.
보통 CALLBACK함수는 typedef 를 이용한 방법을 사용한다.
출처 : 내생각(일부) + 김경진님 + 염원영님
ex)
typedef int (*Fun) (int n);
class CTestThreadDlg : public CDialog
{
// Construction
public:
CTestThreadDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_TESTTHREAD_DIALOG };
Fun _Fun;
//생략
static int GetNum(int n);
};
int CTestThreadDlg::GetNum(int n)
{
return n;
}
BOOL CTestThreadDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//생략
//static으로 선언되어 있으므로 GetNum은 주소이다.
_Fun = GetNum;//방법1 typedef으로 선언한 변수를 사용하면 주소를 가질 수 있다.
int (*aaaa)(int aaaaa);//방법2 멤버변수가 아니므로 주소를 가질 수 있다.
aaaa = GetNum;
return TRUE; // return TRUE unless you set the focus to a control
}
'프로그래밍 팁 > etc' 카테고리의 다른 글
쓰레드 상속받아 사용하기 (0) | 2010.04.03 |
---|---|
간단한 데이타 전송 방법(ATOM) (0) | 2010.04.02 |
Sleep (0) | 2010.03.31 |
프로세스 이름(이미지 이름)으로 핸들값 얻기 (6) | 2010.03.29 |
IP주소값 가져오기 (0) | 2010.03.29 |