이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다.
저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나
토론을 할 수도 있습니다.
닷넷 프로그래밍을 하다 보면, 닷넷 프레임워크 클래스들이 제공하지 않는 기능들이 필요할 때가 있습니다. 저번 포스트에서
시스템의 메모리에 대한 정보를 구하는 방법에서도 WIN32 API를 호출했었죠. 이렇게 WIN32 API를 호출해야 할 때, C/C++에 익숙하지 않은 개발자는 WIN32 API에 대한 P/Invoke (Platform Invoke) 선언을 할 때 대단히 당혹스러운 경우가 많습니다. 뭐 하나 참고할 것도 없고, MSDN에 P/Invoke와 마샬링(marshaling)에 대한 설명이 자세히 되어 있지만, 그것도 C/C++으로 WIN32 API 호출을 많이 해본 사람이나 알아들을 내용이 많은지라...
그래서 이번 포스트에서는 P/Invoke 에 대한 닷넷 선언을 모아 놓은 데이터베이스를 소개할까 합니다. P/Invoke에 한이 많이 맺히신 분이나 WIN32 API에 대한 닷넷 선언이 필요하시다면 참고하시기 바랍니다. 단순히 이 데이터베이스에서 원하는 선언을 달랑 찾아 쓰지만 마시고, 어떻게 그런 선언이 나왔는가 살펴보는 것이 중요합니다. 반드시 WIN32 API에 대한 설명을 MSDN에서 찾아보시고 그것을 어떻게 닷넷에서 선언되었는지 반드시 검토해 보는 것이 P/Invoke 실력을 늘이는 지름길입니다.
P/Invoke Declaration DB: PINVOKE.NET
컴퓨터의 활용도는 점차 늘어가고 있다. 울 마누라는 음식 조리법을 인터넷에서 습득한다. 10년전 같았으면 시어머니, 혹은 친어머니, 주위 아즘마들에게나 습득했을 지식이다. 이렇게 컴퓨터가 다양하게 사용됨에 따라서 컴퓨터 프로그램에 대한 요구들도 점차로 다양해 지고 있다. 특히, 짧은 시간에 많은 프로그램(?)을 작성해야 하는 기업용 SI 프로젝트들은 에디터, RSS 리더, 미디어 플레이어, 게임 등의 개발에 사용하는 C/C++ 언어로는 24시간 개발을 해도 택도 없는 경우가 많다. 그래서 4GL 이니 코드 생성기, 개발 프레임워크니 등등의 제품들을 사용하여 어떻게 하든 개발 생산성을 올리고자 지랄 발광을 하는 것이다.
4GL 류에 속하는 프로그래밍 언어들으론 파워빌더, VB 6.0, Delphi 등이 있다. 이들 4GL 개발환경들의 특징은 널리 사용되는 기능, 함수들을 이미 구현하고 있어서 손쉽게 개발이 가능하다는 점이다(아닌가? 아니면 말고... -_-). 또 하나 4GL의 특징 중 하나는 뭐 좀 해볼라고 하면 해당 API가 없기 십상이라는 것이다(그래서 필자는 그닥 좋아하지 않는다. 델파이는 제외!). 그래서 어쩔 수 없이 C/C++에서 사용하는 WIN32 API를 직접 호출하지 않으면 안 되는 X 같은 시츄에이션이 발생한다.
닷넷 프로그래밍 환경이 기존 4GL 프로그래밍 환경과 C/C++ 개발 환경을 절충한다고 하지만(WIN32 API를 사용해야 하는 상황이 줄어 들었다고 하지만), 여전히 WIN32 API 나 기존 C 기반의 DLL 호출이 필요한 경우가 대단히 많다(닷넷 프레임워크가 4GL이라고 할 수 있을까? 쓰바 그런거 가지고 고민하기 싫다... 맘대루 생각해라... -_-). 그럴 때 닷넷이 제공하는 편리한(?)P/Invoke (Platform Invoke) 기능을 이용하여 WIN32 API, 혹은 기 개발된 DLL의 함수를 호출할 수 있는 것이다!
Using P/Invoke
P/Invoke 가 뭔지 첨 들어봤다면... 대략 난감하다. 여기서 그걸 다 설명할 수 없으니 월간 마이크로소프트 2002년 6월호 닷넷 칼럼에 필자가 기고한 "닷넷 플랫폼에서 DLL 코드 접근, Unmanaged 코드 다루기" 이란 글을 읽어 보기 바란다. 과월호이기 때문에 PDF를 다운로드 해야 하는데... 500원을 써야 할 것이다. 아까운가? 그렇담 지금 보고 있는 사이트를 떠나 MSDN에서 P/Invoke에 대한 자료를 찾아 보기 바란다. 이건 공짜다... (부자 되세요~~~ ^^)
P/Invoke를 사용하면 WIN32 API 뿐만아니라 기존에 C/C++ 개발했었던 DLL 들도 호출할 수 있기 때문에 보다 풍부한 개발환경 속에서 개발할 수 있게 된다. 그런데... P/Invoke 란 것이 닷넷에서 API에 대한 선언을 해주어야만 사용 가능한 것이기 땀시 API를 닷넷에서 선언할 수 없다면 조또 아닌게 되어 버린다는 것이다.
그렇다면 API에 대한 P/Invoke 선언이 쉽냐 하면 그것도 아니다. C/C++ 프로그래밍 지식, WIN32 API 호출 규칙, 데이터 구조체에 대한 지식(메모리, 정렬 등등)에 대한 지식이 없다면 약간만 복잡한 API 만 등장해도 바로 "조까~" 라고 외치고 두손 두발을 들어야 하는 경우가 허다 하다. C++로 프로그램깨나 해봤다는 사람도 WIN32 API 호출에 능숙하지 않다면(MFC로만 개발했다면 그럴 수도 있다), P/Invoke 선언은 만만하지 않은 상대이다(무서븐 넘...).
그렇다면 많이 사용되는 WIN32 API 인데, 미리 선언된 것을 가져다 쓰는 것이 어떨까? 그렇다. 자신이 하기 힘들다면 남이 해놓은 걸 가져다 쓰면 된다. 정확히 그런 용도로 제공되었던 유틸리티가 VB 6.0의 API 뷰어란 녀석이다. 이 놈은 WIN32 API에 대한 VB 6.0의 선언을 데이터베이스화 해놓고 그것을 찾아다가 아주 쓰기 좋게 클립보드에 복사까지 해주는 착한 녀석이다.
화면1. VB 6.0에서 제공되었던 WIN32 API 뷰어
그런데... 닷넷 프레임워크에서는 조또 이런 유틸이 없다. 아마도 닷넷에서는 WIN32 API를 호출하는 일이 거의 없다고 스스로 판단한 것일까? 아니면 6만개도 넘는 API와 구조체, 상수들을 모두 데이터베이스화 할 수 없다고 판단해서 일까? 어찌 되었건 없는 건 없는 것이다.
PINVOKE.NET Site
이가 없으면 잇몸으로 살라고 했던가? (오호~). 닷넷 판 API 뷰어가 있었으니 그것이 바로 PINVOKE.NET 사이트 이다. 이 사이트는 다양한 WIN32 API 들에 대한 P/Invoke 선언을 모아놓은 위키(WIKI) 데이터베이스 이다. 누구나 P/Invoke 선언을 추가할 수 있고 검색해서 가져다 쓸 수 있는 만인의 P/Invoke 데이터베이스인 것이다.
화면2. PINVOKE.NET 사이트
위키 데이터베이스인 만큼 찾는 API 선언이 없을 수도 있고, 발견했더라도 그것이 잘못된 것일 수도 있다. 어떤 인간이 잘못된 선언을 올려놓을 수도 있기 때문이다. 또한 API 선언이 발견되었더라도 선언을 작성한 사람에 따라서 친절하게 설명과 예제까지 달아 놓았을 수도 있고, 달랑 선언만 한 두어 줄 써 놓았을 수도 있다. 찬밥 더운밥 가릴 때 인가? 이 정도만 되도 감동의 도가니탕에 빠져 API를 열나 찾아 볼 것인데... 비주얼 스튜디오에서 PINVOKE.NET 을 검색하고 검색 결과를 에디터에 복사해주는 애드인(Add-in)까지 제공하지 아니한가 !!! 이 애드인은 GotDotNet 사이트에 등록되어 있으니 다운로드 받아 설치해서 사용해 볼 수 있다.
화면3. PINVOKE.NET Add-in (Visual Studio 2003)
Training... Training...
PINVOKE.NET 사이트에서 다양한 P/Invoke 선언을 찾아서 가져다 쓰면 많은 시간을 절약할 수 있을 것이다. 하지만 다시 한번 당부 하건데... 찾아 쓰는 데에서 그치지 말기 바란다. 어떻게 그런 선언을 했는지 궁금하지 않은가? 그리고 자신도 직접 그런 선언을 만들어 보고 싶지 않은가? 그렇다면 PINVOKE.NET 사이트는 단순히 WIN32 API에 대한 선언을 모아 놓은 것이 아니라, 여러분의 P/Invoke 선언에 대한 무궁무진한 문제 은행 역할을 할 것이다. 필요한 선언이 있다면 직접 스스로 선언을 해 봐라. 그리고 PINVOKE.NET 에서 찾아 보고 둘 사이의 차이점을 살펴봐라. 처음에는 둘의 차이점이 무엇인지 그리고 누가 맞았는지 알기 힘들 것이다. 그럴 때는 두 선언에 대해 모두 테스트 해보고 어떤 것이 왜 틀렸는가를 생각해 보면 좋을 것이다. 이런 과정이 반복 된다면 어느새 자신의 P/Invoke 선언을 PINVOKE.NET에 등록하는 자신을 발견하게 될 것이다. 머찌지 않은가? 아니면 말고... -_-;
Comments (read-only)
#re: P/Invoke 선언 데이터 베이스 : PINVOKE.NET / 정성태 / 11/30/2005 1:36:00 PM
매번 느끼는 거지만... 토픽 쓰시는 실력이 대단하세요.
위의 토픽을 제 홈피에 써본다면... 아마 다음과 같은 정도로 끝냈을 것 같습니다.
P/Invoke 선언 찾아주는 Add-in :
http://GotDotNet뭐시기URL/download/
저는 왜케 말을 못 늘이는 걸까요? 요즘 일하는 곳에서 "아키텍쳐 정의서" 같은 거 작성하는데... 대부분 "단문"으로 끝나는 바람에 뽀대가 안나서 미치겠습니다. ^^;
#re: P/Invoke 선언 데이터 베이스 : PINVOKE.NET / 블로그쥔장 / 11/30/2005 2:10:00 PM
에이... 성태씨는 웬 과찬을... ㅋㅋ
그런데... 컨설팅 해 보시면... SI 프로젝트에서는 단문으로 짧게 짧게 끝나는 문장을 더 좋아하던뎅...
(시간 없어서 다 몬 읽어 본다고... 쯔읍...)
가끔 좍~ 풀어쓰는 것도 필요하지만...
요는 요점을 전달하는게 중요하죠...
요렇게 최대한 잼있게 써줘야 한 사람이라도 더 놀러 오죵... 으흠....
#re: P/Invoke 선언 데이터 베이스 : PINVOKE.NET / 선우아빠 / 12/5/2005 8:51:00 PM
정성태님 말씀에 한표~
#re: P/Invoke 선언 데이터 베이스 : PINVOKE.NET / 웹지니 / 12/8/2005 12:16:00 PM
저도 성태님 말씀에 뿌라쓰 한 표! 헷~