출처: http://blog.naver.com/kieuns?Redirect=Log&logNo=80019436298

C#으로 공부겸 해서 겸사겸사  뭔가 ( 흠 -_-; ) 만들어보고

있는 중에 씨#에서 Win32Api를 쓸 일이 생겼다.

이번에도 구글에서 검색, 대략 "어떻게 씨#에서 Win32Api를 쓰지?" 라고 쳤다.

그리고 결과가 주루룩...


씨에서는 함수 선언부에 __declspec(import,export) 따위를 붙여서 내보내거나

얻어와야 했던 반면 씨#에서는 세련된게 함수 프로퍼티로 가져올 함수를

명세할 수 있었다.


씨에서는 LoadLibrary() -> GetProcAddress() 해야했었는데,

( 나는 일반함수를 가져다 쓸때도 lib을 붙여 컴파일하는걸 별로 안좋아한다.

   DirectX 함수들도 GetProcAddress()로 가져다 쓰는걸 좋아한다. )

인데 씨#에서는


[DllImport( "mydll.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall )]
public static extern int GetLastErrorCode();


만으로 한곳에서 모든 명세가 완료되어 바로 사용가능했다. (간편하다..고 느꼈다.)

나는 이 코드가 멋지다고  생각한다. 작업하다보면 자바와 씨#을 자꾸 비교하게

되는데 자바도 씨#처럼 가상머신을 벗어나서 플랫폼에 종속되는 부분을

건드릴 수 있게 넣어줬더라면 지금 짜고 있던걸 분명히 자바로 만들려고 했을거다.

한가지 더 생각해보는데, 다른 os 였으면 자바를 썼을까?

아마 리눅스에서 쓸려고 생각했다면 파이썬으로 짜고 있었을것 같다.

리눅스 환경에서 자바에 한글을 쓰려고 하려고 삽질했던것 생각하면... 부르부르부르..


씨# 책에서 프로퍼티는 자세히 안읽어봤었는데, 아무래도 함수마다 속성이 각각

붙는다는 개념은 생소하기도하고 이상하기도 해서, 저 프로퍼티가 씨#

프로그래밍의 주요 키워드 일지도 모른다는 생각이 들어서 꼼꼼히 정독해야

할 것 같다.


또 한참 진행하다가 재밌는데서 막혔다. 씨로 dll을 한개 만들고 씨#에서 그걸 사용 중인데,

뭐하고 있는지 알지도 모르겠다. 지금 난 후킹기능을 씨#에서 쓰려고 한다,

테스트를 위해서 dll 쪽에 함수 포인터를 선언했고 씨#의 함수를 그 변수에 할당해

보려고 했다. 즉, 씨#의 함수주소를 dll 쪽으로 넘겨서 호출해보려는 것였다.

잠시고민.. 하다가 delegate 키워드를 함 써보기로 했다.

내가 본바로는 이녀석이 씨#에서 함수포인터를 선언할때 쓰는 넘이다.

public delegate void HookProc( Int32 wParam, IntPtr lParam );


위 함수는 씨로


typedef void __stdcall SendWindowInfo( WPARAM, LPARAM );


라고 디파인 되어 있다.

이렇게 프로토타입을 선언하고, 씨 함수에서 함수 포인터를 전달하는 부분에서


StartHooking( new HookProc(ShellProc) );


라고 실행해봤다. StartingHooking()mydll.dll 에서 가져온 함수다.

전통적인 씨 개발자로서는 이미 인스턴스화 되어 있는 함수를

다시 new 로 할당해서 쓰는게 어색하기만 하다. 하지만..

실행은 한방에 되었다~! 오호라.. 이렇게도 쓰는군. (간단하고 멋지걸..)


언어 구현에 대한 고민이 간단히 해결되니 뭔가 굉장한 횡재를 한 기분이었다.

( 예전에 씨++언어 초보시절에서 이랬을까? )


가만.. 히 생각해보니 이런 방식의 코드를 어디선가 본 듯한 생각이 들었다.

그래서 msdn을 다시 키워드 검색해보니,

이런 비스므리한 코드가 비베에서도 쓰였다..기 보다 비베에서 가져온 방식이었다.

흠.. 뭔가 설명하기 힘든 애매한 기분.

하지만 비베를 다시 보게 됐다. 기능이 좀 막강한걸..라고 흘.


다음엔 윈도우메시지를 받을 방법이 없을까? 같은 고민이 생겼다.

자꾸 씨#으로 씨++ 프로그래밍을 짜려고 한다. 영어를 한국말 하듯이 

해버리려고 하는 것 같은 느낌이다.


각 언어는 그 특성에 맞게 느낌을 살려줘야한다.고 생각한다. 어셈블리어로

CRT 함수를 가져다 쓰면서 프로그램을 프로시져로 잘게 쪼개면서 만드는건

어셈블리어답지 못하다. 레지스터와 스택을 최대한 돌려 사용하면서 코드

사이를 점핑해 다녀야 어셈블리어 답다.


씨#도 이런 특징이 있을 것 같다. 아직 모르겠지만 말야..

애시당초 씨++로 만들어야 했나? 하는 생각도 드는데..


-_-; 일단 해보지 뭐.


AND