문법적으로 궁금합니다.
조회수 480회
c++ hooking 보고있는중
typedef HRESULT(__stdcall* endScene)(IDirect3DDevice9* pDevice);
이러한것을 봐서 무슨 의미인지 모르겠네요.
2 답변
-
함수포인터타입정의요.
endScene fpEncScene; fpEncScene = some_addr; // setting fpEncScene(device); // calling the function
-
daewon님 말씀대로 함수 포인터 타입 정의이구요.
설명을 조금 적겠습니다.
우선 아래 코드와 결과를 보시면 함수 포인터 타입의 정의가 어떻게 사용되는지 쉽게 아실수 있을거에요.
- 코드
#include <iostream> using namespace std; int sum(int a, int b) { return a + b; } typedef int (*p_sum)(int a, int b); // 함수 포인터 타입 정의 int main() { p_sum my_sum = sum; // 함수 포인터 변수 정의 cout << "sum: " << sum(10, 20) << '\n'; // 일반 함수 sum 사용 cout << "my_sum: " << my_sum(10, 20) << '\n'; // 함수 포인터 사용 return 0; }
- 결과
함수 포인터 타입을 아래와 같이 정의했을 때,
(*p_sum)
과 같이 함수 이름 부분의 앞에 별이 있고 그 앞뒤로 괄호가 쳐져 있는 것으로 함수 포인터라는 것을 알 수 있구요. 함수 이름 부분의 앞쪽의 반환 값과 뒷쪽의 매개변수의 형태를 보고, 이 함수 포인터 타입으로 선언한 변수에는 반환값이 int 이고, 매개변수가 (int, int)인 함수의 주소만 저장할 수 있다는 것을 알 수 있습니다. 반환값과 매개변수 형태가 매칭이 안되면 컴파일 에러가 됩니다.typedef int (*p_sum)(int a, int b);
질문하신 아래 코드 같은 경우에는
endSene
타입으로 선언된 변수에는 반환값이HRESULT
이고 매개변수의 형태가(IDirect3DDevice9*)
인 함수의 주소값만을 넣을 수가 있습니다. 그리고__stdcall
는 함수가 WINAPI 함수라는 것을 뜻하는 예약어 같은 것입니다. WINAPI 함수들 앞에 붙어 있습니다.typedef HRESULT (__stdcall* endScene)(IDirect3DDevice9* pDevice);
아래 코드와 결과도 참고하세요. 이해에 도움이 될거에요.
- 코드
#include <iostream> #include <Windows.h> using namespace std; typedef DWORD (__stdcall* p_name)(LPSTR lpConsoleTitle, DWORD nSize); int main() { p_name my_get_console_title = GetConsoleTitleA; char str1[80] = { 0, }; char str2[80] = { 0, }; GetConsoleTitleA(str1, 80); my_get_console_title(str2, 80); cout << "str1: " << str1 << '\n'; cout << "str2: " << str2 << '\n'; return 0; }
- 결과
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력