문법적으로 궁금합니다.

조회수 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;
    }
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)