[완료]Winapi의 Wndproc가 function pointer로 호출되는 이유는 무엇일까요?

superdma의 이미지

winapi32 의 hello world 출력예제 코드를 보면,
MyRegisterClass함수에서 wcex.lpfnWndProc=(WNDPROC)WndProc; callback Wndproc를 함수포인터로 등록합니다.

어플을 실행시키고 winmain에서 loop를 도는 getmessage가 메시지를 핸들링 하고
결국 내부적으로 message structure의 각 멤버변수를 등록된 callback Wndproc의 인자값으로 넣어서 호출합니다.

그런데 여기서 생기는 제 궁금중이
mesasge struct안에는 destination을 결정하는 변수가 2개 있습니다.
message id와 handle이죠.

허나 현재 작동중인 win xp os는 hello world 어플말고 여러 Wndproc가 호출되어 있을것이고
message id와 handle만으로 메시지를 전달할 Proc를 구분하기 위해서는 별도의 매커니즘이 필요할 것 입니다.

고로 Winapi32의 아키텍쳐를 만들던 사람들은 c언어의 함수포인팅을 이용해 이런한 Callback 메커니즘을 구현하고,
이에 맞춰 적절히 메시지를 핸들링 하고 있다고 생각합니다.

정리해서 질문드리자면, 함수포인터를 이용해서 Wndproc를 등록하는 이유자체가
Event Message를 전달하기 위한 일종의 편법의 범주에서 효율적인 방안이라고 유추하게 되었는데
어떻게 생각하시는지요?

저는 Winapi32를 Hello world 만 공부해본 사람입니다.
프로젝트가 Win32에서 작업을 해서 지금 공부하고 있는데 갑자기 의문이 드는군요.
많은 조언 부탁드립니다.

drinkme의 이미지

windows procedure를 등록하는 것은
현 process에 대한 무언가라기 보다는
내가 지금 등록한 (말씀하시는 경우에서는 main window가 되겠죠) window에 대한
message를 받겠다는 거거든요.

가령, 마우스로 화면상에 click을 했다고 칠때,
그 위치에 님이 만든 어플리케이션의 button이 있었다면,
GUI system은 마우스 click위치에 대해서, hotspot check를 해서
해당 위치에 있는 window의 handle을 얻어내고요.
그 window로 button down이든 뭐든 보내겠죠.

그 윈도우를 생성하고 또, getmessage 등으로 님이 만든 app가
그 윈도우의 메시지를 얻어오려고 하고 있으니까,
그게 님의 process내에서 진행이 되는 것입니다.

....

결론은
메시지라는 것은 window에 대해서 주고 받는 것이지,
process에 대해서 주고 받는 것이 아니라는 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.