ctypes
ctypes은 파이썬 개발자가 이용할 수 있는 가장 강력한 라이브러리 중 하나다.
ctypes 라이브러리 에서는 세 가지 방법으로 동적 라이브러리를 로드할 수 있다.
cdll() - cdecl 호출 규약을 이요하는 함수를 익스포트 하는 라이브러리를 로드하는데 사용
windll() - 마이크로소프트 win32 API가 사용하는 stdcall 호출 규약을 이요하는 함수를 익스포트하는 라이브러리를 로드하는 데 사용
oledll() - windll() 방법과 동일하게 동작하지만 익스포트 함수가 반환하는 값이 HRESULT라 가정한다.
이 세 가지의 방법의 차이점은 익스포트 함수를 호출하는 방법과 리턴 값을 반환하는 방법에 있다.
익스포트함수가 뭔지 모르겠다... 알게되면 수정을 해야겠다.
HRESULT => 마이크로소프트 컴포넌트 객체 모델에서 에러 메시지를 반환하기 위해서 특별히 사용되는 것이다.
함수 호출 규약
cdecl호출 규약
파라미터를 오른쪽에서 왼쪽 방향으로 스택에 PUSH
stdcall 함수 호출
파라미터의 순서가 cdecl과 동일 하지만 함수 호출자가 스택을 정리하는 것이 아니라 함수가 리턴하기 바로 전에 스택을 정리한다(??? 무슨말인지 모르겠다 알게되면 수정하겠다.)
두 가지 호출 규약 모두 EAX 레지스터를 이용해 리턴 값을 전달한다는 사실!!
C 데이터 타입
위의 표는 C, 파이썬, ctypes의 데이터 타입이 서로 어떻게 매핑되는지 간략히 보여준다.
레퍼런스를 통한 파라미터 전달
ctypes에서 포인터를 핢수의 파라미터로 전달하려면 byref() 함수를 사용한다.
즉 function_main( byref(parameter) )와 같은 형태로 호출하면 된다.
구조체와 유니언
유니언은 구조체와 매우 유사하다. 하지만 유니언에서는 모든 멤버 변수가 동일한 메모리 공간을 공유한다. 그래서 유니언은 서로 다른 데이터 타입에 동일한 값을 저장하는 것이 가능하다.
밑의 예제를 보자.<예제>
<결과창>
결과창을 보면 유니언은 하나의 값을 할당해 그 값을 세 가지 형태로 표현하는 것이 가능하다.
<예제>소스를 보면 barley_char에 (* 8) 이 되어있는데 이것은 배열 요소의 개수를 나타낸다고 한다. * 8이 되어있으니 8개의 요소를 갖고있다는걸 알 수 있다.
'파이썬 스터디 과제 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
3장-4 브레이크포인트-1 (소프트브레이크포인트) (0) | 2015.01.16 |
---|---|
3장-3 디버그 이벤트 핸들러 구현 (0) | 2015.01.15 |
3장-2 CPU 레지스터 상태 얻기 (0) | 2015.01.14 |
3장-1 디버기 (0) | 2015.01.14 |
2장-디버거 (0) | 2015.01.12 |
댓글