对于大都数初学windows程序设计的学习者来说,经常会出现很多错误,很多人编写程序编译通过了,可是连接却始终出现错误,这着实令人头疼
下面先开一个编写API函数时常见的错误吧:
图示是我在编写一个简单的API函数:
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数声明
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG Msg;
//----------------------------------定义并初始化窗口类---------------------------------
WNDCLASS wndclass;
char lpszClassName[] = "窗口";
static TCHAR szAppName[] = TEXT ("HelloWin");
char lpszTitle[] = "My_Windows";
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = lpszClassName;
//--------------------------窗口类的注册---------------------------
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program require Windows NT!"),szAppName,MB_ICONERROR);
return FALSE;
}
//创建窗口
hwnd = CreateWindow(
lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
//窗口函数定义
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
当进行编译时,编译通过,可是进行连接时却出现了一个错误,这让我着实头疼
经过查阅相关资料发现:
在创建API项目时,如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如我今天遇到的:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
解决方法:
控制台项目要使用windows子系统, 而不是console, 设置:
[Project] (工程)--> [Settings](设置) --> 选择"Link(连接)"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows.
程序运行结果如下
需要注意的是:
在新建工程时要分清Win32 Application和Win32 Console Application.它们都是工作在32位Windows环境的程序.其中Win32 Application 就是普通的常见的窗口应用程序,它们都是所谓的GUI(Graphics User Interface图形用户接口.而Win32 Console Application(win32控制台应用程序)往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,或者叫CUI(Character User Interface字符用户接口)。
因为Win32 Application的入口函数为WinMainWin32 Console Application的入口函数是main也就是说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了