windows程序中WinMain和响应函数myproc哪部分形成进程?

hztj2005 2012-12-11 12:18:46
windows程序中WinMain和响应函数myproc,都是回调函数,就我们看来似乎是脱节的两部分。是我想知道编译装载后,哪一部分形成进程?还是WinMain和响应函数myproc各自生成1个进程,一共2个进程?

#include <windows.h>
#include "resource.h"
#include <stdio.h>
int x,y;
LRESULT CALLBACK myproc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CLOSE:
if(IDOK==MessageBox(hwnd,"你是真的要退出吗?","系统提示",MB_OKCANCEL|MB_ICONINFORMATION))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
case WM_CHAR:
{
char buf[100];
sprintf(buf,"%d",wParam);
MessageBox(hwnd,buf,"show",MB_OK);
break;
}
case WM_MOUSEMOVE:
{//这里和上面的情况用大括号一是为了防止buf的重复定义,二是为解决类似int x=LOWORD(lParam);的定义编译器糊涂报错。
HDC hdc=GetDC(hwnd);
char buf[100];
sprintf(buf,"x=%d,y=%d",x,y);
SetTextColor(hdc,RGB(255,255,255));
TextOut(hdc,0,0,buf,strlen(buf));
//InvalidateRect(hwnd,NULL,true);
//PostMessage(hwnd,WM_PAINT,0,0);
//SendMessage(hwnd,WM_PAINT,0,0);
x=LOWORD(lParam);
y=HIWORD(lParam);
memset(buf,0,100);
sprintf(buf,"x=%d,y=%d",x,y);
SetTextColor(hdc,RGB(0,0,0));
TextOut(hdc,0,0,buf,strlen(buf));
ReleaseDC(hwnd,hdc);
break;
}
}
return 1;
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=NULL;
wndclass.cbWndExtra=NULL;

wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);

wndclass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_POINTER));

wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=myproc;
wndclass.lpszClassName="mywnd";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW;
RegisterClass(&wndclass);
HWND hwnd=CreateWindow("mywnd","window test",WS_OVERLAPPEDWINDOW,100,100,400,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOW);
MSG msg;
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
...全文
173 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2012-12-12
  • 打赏
  • 举报
回复
引用 7 楼 BeanJoy 的回复:
没错,是windbg,并且要加载符号的。 引用 srv*downstreamstore*http://msdl.microsoft.com/……
以前下载过windbg,如果调试windows系统需要装虚拟机,没有完全弄通,就没有再用这个。 以后有时间再来学习使用这个工具。 谢谢!
潇潇雨云 2012-12-11
  • 打赏
  • 举报
回复
进程的话肯定就一个,进程是一个当前状态和一组相关的系统资源所描述的活动单元,即使是线程的话按照楼主的代码也是一个,只有winmain形成线程,回调的那一部分可以看成一个普通函数而已。
BeanJoy 2012-12-11
  • 打赏
  • 举报
回复

这幅图就能很好的说明问题,调用层次也很清晰。WinMain是由kernel32调用的,然后接收到消息后,调用DispatchMessage,在这里面一步步调用到WndProc。
schlafenhamster 2012-12-11
  • 打赏
  • 举报
回复
就‘进程’而言 应该是 一个 进程,否则 就会 跨进程,麻烦大了。
BeanJoy 2012-12-11
  • 打赏
  • 举报
回复
引用 4 楼 hztj2005 的回复:
DispatchMessage,一步步调用到WndProc,这就好理解了。 这个过程,到内核去转了这么个弯.... 请教2楼,右侧的窗口是如何显示的。我在VC下,显示调用/被调用功能不能做到。
没错,是windbg,并且要加载符号的。
引用
srv*downstreamstore*http://msdl.microsoft.com/download/symbols
这是微软符号库,用到时自动下载到windb目录下的downstreamstore里,已经有320多M了。
schlafenhamster 2012-12-11
  • 打赏
  • 举报
回复
那个‘Calls’说明是 调用窗口
Eleven 2012-12-11
  • 打赏
  • 举报
回复
引用 4 楼 hztj2005 的回复:
DispatchMessage,一步步调用到WndProc,这就好理解了。 这个过程,到内核去转了这么个弯.... 请教2楼,右侧的窗口是如何显示的。我在VC下,显示调用/被调用功能不能做到。
那个应该是WinDBG~
hztj2005 2012-12-11
  • 打赏
  • 举报
回复
DispatchMessage,一步步调用到WndProc,这就好理解了。 这个过程,到内核去转了这么个弯.... 请教2楼,右侧的窗口是如何显示的。我在VC下,显示调用/被调用功能不能做到。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧