您的位置:首页 > 移动开发

关于使用Visual C++ 编写API(Application Programming Interface)函数时编译那点事

2014-05-09 19:41 387 查看
对于大都数初学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的入口函数为WinMain

Win32 Console Application的入口函数是main也就是说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐