int WINAPI WinMain()是如何创建的?

jiahehao 2007-09-20 11:14:33
在网上找的程度例子代码,是关于钩子的应用的。下面的是主程序,主要工作是创建一个对话框,对话框类型是(DLGPROC)ProcMain。
我的疑问是int WINAPI WinMain(。。。)是个什么类型的程序?我用VC6创建的MFC AppWizard(exe)和Win32 Console Application程序生成的入口函数都不是这个类型。
第二个问题是int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)的参数是怎么来的?不用初始化就直接创建的时候声明吗?
请高手赐教。

例子如下:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)ProcMain, 0);
return 0;
}
...全文
887 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
appleboyecho 2007-09-20
  • 打赏
  • 举报
回复
看一下深入浅出MFC
appleboyecho 2007-09-20
  • 打赏
  • 举报
回复
第一个问题楼上回答了,第二个问题其参数是每一个应用程序运行之前由startupcode传进去的,这是WINDOWS给其传进去的。
菜牛 2007-09-20
  • 打赏
  • 举报
回复
你用向导创建“Win32 Application”就有了。
liuliu20036 2007-09-20
  • 打赏
  • 举报
回复
贴个正规的sdk程序:
#include<windows.h>
#include<stdio.h>

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
WNDCLASS wnd;
wnd.cbClsExtra=0;
wnd.cbWndExtra=0;
wnd.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor=LoadCursor(NULL,IDC_ARROW);
wnd.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wnd.hInstance=hInstance;
wnd.lpfnWndProc=WindowProc;
wnd.lpszClassName="wang";
wnd.lpszMenuName=NULL;
wnd.style=CS_HREDRAW|CS_VREDRAW;

RegisterClass(&wnd);

HWND hwnd;
hwnd=CreateWindow("wang","第一个win32程序",WS_OVERLAPPEDWINDOW
,20,20,600,400,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG Msg;
while(GetMessage(&Msg,NULL,0,0))//必须为空,代表主线程
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}


LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hdc;
switch(uMsg)
{
case WM_CHAR:
char c[20];
sprintf(c,"char is %d",wParam);
MessageBox(hwnd,c,"WM_CHAR",0);
break;
case WM_PAINT:
PAINTSTRUCT paint;
hdc=BeginPaint(hwnd,&paint);
TextOut(hdc,100,100,"第一个win32程序",strlen("第一个win32程序"));
EndPaint(hwnd,&paint);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse click","WM_LBUTTONDOWN",0);
hdc=GetDC(hwnd);
TextOut(hdc,0,10,"第一个win32程序",strlen("第一个win32程序"));
ReleaseDC(hwnd,hdc);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否退出应用程序?","WM_CLOSE",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(WM_QUIT);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
Y___Y 2007-09-20
  • 打赏
  • 举报
回复
入口函数可以是任意的名字,不必非得要是main之类的
例如
#pragma comment(linker, "/ENTRY:EntryPoint")
将入口函数改为了EntryPoint
void EntryPoint()
{
.......
}

使用WinMain之类的函数会做一些初始化和一些扫尾的工作
jiahehao 2007-09-20
  • 打赏
  • 举报
回复
我的意思是我如何创建int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)这样的入口函数,是直接把Win32 Console Application的入口函数WinMain改成这样的声明类型吗?
Chivalry 2007-09-20
  • 打赏
  • 举报
回复
参数是系统传进去的
Win32 Console Application的入口函数应该是WinMain阿
coldplay968 2007-09-20
  • 打赏
  • 举报
回复
WinMain 是窗口程序的入口函数
建议lz看下 windows程序设计的前面几章
jiahehao 2007-09-20
  • 打赏
  • 举报
回复
多谢各位热心做答,兄弟还要多学习啊。。。。。。。。结帖。

16,472

社区成员

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

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

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