본문 바로가기

프로그래밍/API

함수 invoke~

예전에도 몇번 올린 내용이지만, 처음 만들게 된 계기는 바로 coroutine을 구현 하면서 였다..

함수에 대한 주소만 가지고 함수를 호출해야 하는 상황이 되는데, 문제는 기존의 방식으로는 제한된
함수의 인자만을 가질수 있다는 것이다. 즉, 다양한 인자를 갖는 함수를 다룰수가 없다는 문제가 있다.

기본의 방식은..
    DWORD (*CALLBACK)( LPVOID args) = &CALLBACK_FUNC;
와 같이 접근해 처리해 주어야 한다는 것이었다.

얼마 지나지 않아, coroutine에 적재되는 함수의 형태에 따라 다양한 인자를 유동적으로 주고 싶어 졌다.
그래서 만든것이 invoke 함수이다.

이 함수는 기존방식 처럼 함수의 주소를 기반으로 접근을 하게 되지만, N개의 인자를 함수별로 별도로
줄수 있으며 다양한 형태의 반환값도 받을수 있다는 것이다.

참고로, 아래 소스의 문제라면 stack으로 넘겨주어야 하는 인자가 buffer에 저장되어 있어야 한다는 것이다.


그러나, 이 함수는 바로 x86 전용 함수라는 것이다.. x64에서는 인자가 레지스터리를 통해 가장 먼저 저장되고
이후에 stack을 사용하기 때문에 별도의 처리가 필요하게 되는데.. 아직 까지 x64에 대한 절실한 필요성을
못 느끼고 있는 상황이므로....

참고로, 이 함수를 사용할 경우 RPC와 같은 개념의 접근이 가능해 진다.. 서버에서 클라이언트의 함수를
직접 호출할수 있다는 것이다^^;

응용해 보시길~

그리고, 응용 샘플은..

PS.
  문제점이나.. 수정 사항이 있다면 알려주는 센스~