태그 글목록: 함수 포인터

[C++ 정리] 포인터형 함수 2015-06-15

함수 또한 변수와 마찬가지로 메모리의 일부영역을 차지하고 있어 참조가 가능하고 이를 파라미터로 넘길 수도 있다. 다음예제는 OS를 구분하여 함수를 구분하여 실행할 수 있도록 함으로써 함수 내부에서는 OS버전에 관계없이 함수를 호출할 수 있게 해준다.

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

typedef void(*FUNCTION_STORE) ();

void FunctionA();
void FunctionB();
void TestFunc(FUNCTION_STORE pFunctionStore);
BOOL IsCurrentProcess64bit();
BOOL IsCurrentProcessWow64();
BOOL Is64BitWindows();

int _tmain(int argc, _TCHAR* argv[])
{	
	FUNCTION_STORE pFunction;	

	if (Is64BitWindows())
	{
		// 64비트의 경우 FunctionA를 참조
		pFunction = &FunctionA;
	}
	else
	{
		// 64비트가 아닐경우 FunctionB를 참조
		pFunction = &FunctionB;
	}	

	// 구분된 함수를 인자로 전달
	TestFunc(pFunction);

	return 0;
}

void FunctionA()
{
	cout << "Call Function A - 64bit OS.\n\n";
}

void FunctionB()
{
	cout << "Call Function B - 32bit OS.\n\n";
}

void TestFunc(FUNCTION_STORE pFunctionStore)
{
	// OS 버전과 관계없이 동일 코드를 실행한다.
	(*pFunctionStore)();
}

BOOL IsCurrentProcess64bit()
{
#if defined(_WIN64)
	return TRUE;
#else
	return FALSE;
#endif
}

BOOL IsCurrentProcessWow64()
{
	BOOL bIsWow64 = FALSE;
	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
	LPFN_ISWOW64PROCESS fnIsWow64Process;

	fnIsWow64Process = (LPFN_ISWOW64PROCESS)
		GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
	if (!fnIsWow64Process)
		return FALSE;

	return fnIsWow64Process(GetCurrentProcess(), &bIsWow64) && bIsWow64;
}

BOOL Is64BitWindows()
{
	if (IsCurrentProcess64bit())
		return TRUE;

	return IsCurrentProcessWow64();
}

function3