用C语言做Win32程序
- 格式:pdf
- 大小:1.07 MB
- 文档页数:73
linux gcc编译win32程序如何通过Linux GCC编译Win32程序在跨平台开发中,有时候我们可能需要在Linux操作系统上编译Windows 平台的程序。
虽然Windows和Linux是两种截然不同的操作系统,但是通过使用GCC编译器和一些工具,我们仍然可以完成这个任务。
在本文中,我将向您展示一步一步使用Linux GCC编译Win32程序的过程。
请按照以下步骤进行操作。
步骤1:安装GCC编译器首先,确保您的Linux系统中已经安装了GCC编译器。
如果没有安装,可以通过以下命令在终端中进行安装:shellsudo apt-get install build-essential这条命令将会安装GCC编译器以及相关的开发工具。
步骤2:安装MinGW工具链MinGW是一个在Windows上运行的开发工具链集合,可以用来编译Windows平台的可执行文件。
我们将在Linux上使用MinGW工具链来编译Windows程序。
您可以通过以下命令在终端中进行安装:shellsudo apt-get install mingw-w64这条命令将会安装MinGW工具链。
步骤3:创建Win32交叉编译环境现在,我们需要为GCC编译器创建一个Win32交叉编译环境。
在终端中运行以下命令:shellsudo update-alternatives config x86_64-w64-mingw32-gcc该命令将显示一个列表,列出了可用的编译器版本。
选择与您的系统架构相对应的gcc版本。
按照提示进行选择。
步骤4:编写Win32程序在准备好编译环境后,我们可以开始编写Win32程序。
创建一个C语言源文件,比如"hello.c",并输入以下代码:c#include <windows.h>#include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCEhPrevInstance, LPSTR lpCmdLine, int nCmdShow) {MessageBoxA(NULL, "Hello World!", "Hello", MB_OK);return 0;}这是一个简单的Win32程序,用于显示一个消息框。
很多学C的朋友认为C语言只能写DOS程序,而不能像C#那样写windows窗体的程序,这你可就打错特错了,今天我来简单掩饰下C语言怎么利用windows提供出来的API写windows窗体程序。
开发工具VC6.0,开发平台windows7。
首先第一步,打开VC,新建工程,选择win32 application,如下图然后新建一个C语言源文件,这个就不截图了,如果这也不会的话相信你也不会来看这篇帖子~呵呵建好文件以后把一下代码输入进去。
编译即可~代码讲解会下帖子下方1.#include <windows.h>2.3.LRESULT CALLBACK Windo WP roc(4. HWND hwnd, //handle to window5. UINT uMsg, //message identifier6. WPARAM wParam, //first message parameter7. LPARAM lParam //second message parameter8. );9.10.11.int WINAPI WinMain(HINSTANCE hInstance,12. HINSTANCE hPrevInstance,13. L PS TR lpCmdLine,14. int nShowCmd15. )//入口函数16.{17. WNDCLASS wndclass;18. HWND wndhwnd;19. MSG msg;20. wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//加载图标21. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//加载鼠标样式22. wndclass.style=CS_VREDRAW | CS_HREDRAW;//窗口样式23. wndclass.lpfnWndProc=WindowProc;//窗口过程回调函数24. wndclass.cbClsExtra=0;//类额外内存25. wndclass.cbWndExtra=0;//窗口额外内存26. wndclass.hInstance=hInstance;//27. wndclass.hbrBackground=(HBRUSH)GetStockObject(SYSTEM_FONT);//窗口颜色28. wndclass.lpszMenuName=NULL;//窗口菜单29. wndclass.lpszClassName="testWindow";//窗口类名30.31. RegisterClass(&wndclass);32. wndhwnd=CreateWindow("testWindow","windows",WS_OVERLAPPEDWINDOW& ~WS_MAXIMIZEBOX,33. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,34. NULL,NULL,hInstance,NULL);35. ShowWindow(wndhwnd,SW_SHOWNORMAL);36. UpdateWindow(wndhwnd);37. while(GetMessage(&msg,NULL,0,0))38. {39. TranslateMessage(&msg);40. DispatchMessage(&msg);41. }42.43. return 0;44.}45.46.LRESULT CALLBACK WindowProc(47. HWND hwnd, //handle to window48. UINT uMsg, //message identifier49. WPARAM wParam, //first message parameter50. LPARAM lParam //second message parameter51. )52.{53. HDC hdc,hDC;54. PAINTSTRUCT ps;55. char szchar[20];56. static int i=0;57. switch (uMsg)58. {59. case WM_PAINT://窗口重绘消息,窗口加载和重绘的时候产生该消息60. hdc=BeginPaint(hwnd,&ps);61. TextOut(hdc,0,0,"窗口加载完成",strlen("窗口加载完成"));//往窗口输出文本62. //MessageBox(hwnd,"Hello World","Hi",MB_OK);63. EndPaint(hwnd,&ps);64.65. break;66. case WM_CHAR://处理键盘按键消息67. sprintf(szchar,"char is %c",wParam);68. MessageBox(hwnd,szchar,"提示",MB_OK);69. break;70. case WM_LBUTTONDOWN://处理鼠标左键按下消息71. MessageBox(hwnd,"mouse click","提示",MB_OK);72. hDC=GetDC(hwnd);73. TextOut(hDC,0,50,"鼠标事件处理时显示文字",strlen("鼠标事件处理时显示文字"));74. ReleaseDC(hwnd,hDC);75. break;76. case WM_CLOSE://窗口关闭消息77. if(IDYES==MessageBox(hwnd,"你确定要关闭吗?","提示",MB_YESNO))78. DestroyWindow(hwnd);79. break;80. case WM_DESTROY:81. PostQuitMessage(0);82. break;83. default:84. return DefWindowProc(hwnd,uMsg,wParam,lParam);//使用缺省值来调用窗口过程函数85. }86. return 0;87.}复制代码要说明的事,windows程序必须包含的头文件就是windows.h,而程序的入口函数叫做WinMain(dos的入口函数叫main),如果搞不清有几个参数,参数怎么写,可以查阅MSDN,WindowProc函数是窗口过程函数,也就是处理窗口消息的函数;先来看winamin函数内部,首先定义了一个WNDCLASS类型的数据,这个类型是windows 提供出来的结构体,他里面有10个成员。
开发Windows程序的三种⽅式软件开发⽅式⼀共有三种:SDK⽅式、MFC开发⽅式、托管环境的开发都是基于消息的开发SDK⽅式原装api的调⽤SDK⽅式使⽤C语⾔和Windows应⽤程序编程接⼝(Windows API)来开发Windows应⽤程序,Windows API⾥⾯都是C函数,类似于C语⾔的标准函数库,只是Windows API这个函数库(或称开发包)⽤来开发Windows应⽤程序。
微软通过Windows软件开发包(Windows Software Development Kit,SDK)来提供Windows API。
这种⽅式是早期开发Windows应⽤程序的唯⼀⽅式,现在在界⾯开发中⽤的不多,但在飞⾮界⾯领域,⽐如多线程、⽹络、图形图像等某些对速度要求较⾼的场合会经常⽤到。
SDK⽅式是底层的开发⽅式,熟悉了SDK ⽅式后,对理解MFC⽅式⼤有裨益。
⽤这种⽅式开发,要求开发者熟悉C语⾔和Windows环境。
这种⽅式开发的Windows程序习惯称为Win32程序。
⽤这种⽅式开发Windows应⽤程序的最⼤好处是只需熟悉C语⾔,不必学习C++语⾔,学会这种开发⽅式能对Windows操作系统底层运⾏机制有相当深⼊的理解,⽽且这种⽅式开发出来的程序相对于其他两种⽅式运⾏速度更快。
下⾯我们来看⼀个最简单的Win32程序。
MFC开发⽅式MFC是对sdk的⾼度封装的类库MFC是微软基础类的缩写(Microsoft Foundation Classes),是⼀个庞⼤的类库,可以理解为⼀种在Windows上开发软件的架构,是微软专为Visual C++定制的。
该类库提供⼀组通⽤的可重⽤的类库供开发⼈员使⽤。
没有MFC之前,Windows上⽤Win32 API进⾏编程,之后MFC出现,在⼀定程度上提⾼了软件开发效率,它是对win32 API的封装,所以易⽤性好,不过性能会⽐win32开发低⼀些,⼆者各有所长吧。
创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。
2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。
在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。
选择完毕后,单击确定按钮。
3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。
找到相应的main函数。
6.在main函数中输入相应的代码。
7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。
所以,在stdafx.h中填写头部文件。
在有main函数的文件中在添加代码:#include “stdafx.h”
即可。
8.按“Ctrl+F5”可以查看运行结果。
如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。
Win32APIC语⾔InputBox输⼊框实现 1#define ID_INPUTEDIT 10012#define ID_OK 100234 BOOL closing = FALSE;5 HWND dialogHandle = 0;67 LRESULT CALLBACK inputBoxWndProc(HWND wndHandle, UINT message, WPARAM wParam, LPARAM lParam)8 {9static char **result = 0;10static HWND inputHandle = 0;1112switch (message)13 {14case WM_NCCREATE:15 result = ((CREATESTRUCT *)lParam)->lpCreateParams;16break;1718case WM_CLOSE:19case WM_DESTROY:20 closing = TRUE;21 dialogHandle = 0;22 PostQuitMessage(0);23break;2425case WM_COMMAND:26int notifyCode = HIWORD(wParam);27int controlId = LOWORD(wParam);28 HWND controlHandle = (HWND)lParam;2930switch (controlId)31 {32case ID_INPUTEDIT:33 inputHandle = controlHandle;3435if (notifyCode == EN_UPDATE)36 {37if (*result == 0)38 *result = malloc(256);39 GetWindowText(inputHandle, *result, 256);40 PostQuitMessage(0);41 }42break;4344case ID_OK:45 SendMessage(wndHandle, WM_CLOSE, 0, 0);46break;47 }48break;49 }5051return DefWindowProc(wndHandle, message, wParam, lParam);52 }5354 WNDCLASS wndClass; // 全局变量⾃动清05556void inputbox_init(void)57 {58 wndClass.hCursor = LoadCursor(0, IDC_ARROW);59// WndClass.hIcon = LoadIcon(0, IDI_APPLICATION);60// wndClass.cbSize = sizeof wndClass;61 wndClass.style = CS_HREDRAW | CS_VREDRAW;62 wndClass.lpfnWndProc = inputBoxWndProc;63 wndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;64 wndClass.lpszClassName = "InputBox";65 wndClass.hInstance = GetModuleHandle(0);6667 RegisterClass(&wndClass);68 }6970 HWND dialog_init(char *hint, char **result)71 {72#define X 573#define OKBUTTON_WIDTH 7574#define INPUTEDIT_WIDTH (width0 - OKBUTTON_WIDTH)75#define INPUTEDIT_Y 2976#define HINT_HEIGHT 2477#define CHAR_WIDTH 878 HWND dialogHandle, inputLabelHandle, inputHandle, okButtonHandle;7980int hint_width = strlen(hint) * CHAR_WIDTH,81 width0 = hint_width + OKBUTTON_WIDTH,82 height = HINT_HEIGHT + INPUTEDIT_Y + 50;8384 dialogHandle = CreateWindow(85 wndClass.lpszClassName, "⽂本输⼊框的标题", WS_OVERLAPPEDWINDOW, 86100, 100, width0 + 50, height,870, 0, wndClass.hInstance, result);8889 inputLabelHandle = CreateWindow(90"STATIC", hint, WS_CHILD | WS_VISIBLE,91 X, 5, hint_width, HINT_HEIGHT,92 dialogHandle, 0, wndClass.hInstance, 0);9394 inputHandle = CreateWindow(95"EDIT", "", WS_BORDER | WS_CHILD | WS_VISIBLE,96 X, INPUTEDIT_Y, INPUTEDIT_WIDTH, 24,97 dialogHandle, (HMENU)ID_INPUTEDIT, wndClass.hInstance, 0);9899 okButtonHandle = CreateWindow(100"BUTTON", "确定按钮", WS_CHILD | WS_VISIBLE,101 X + INPUTEDIT_WIDTH + 5, INPUTEDIT_Y, OKBUTTON_WIDTH, 24,102 dialogHandle, (HMENU)ID_OK, wndClass.hInstance, 0);103104return dialogHandle;105 }106107char *inputbox(char *hint)108 {109static char *result = 0;110 MSG msg;111112if (dialogHandle == 0)113 {114 dialogHandle = dialog_init(hint, &result);115116if (dialogHandle == 0)117return0;118 }119120// 在桌⾯显⽰窗⼝121 ShowWindow(dialogHandle, SW_SHOWNORMAL);122123// 刷新窗⼝客户区124// UpdateWindow(dialogHandle);125126while (GetMessage(&msg, 0, 0, 0))127 {128 TranslateMessage(&msg);129 DispatchMessage(&msg);130 }131132return result;133 }。
c语言滚轮代码在 C 语言中,通常使用图形界面库来处理滚轮事件。
这涉及到操作系统特定的功能和库的使用。
以下是一个简单的示例,展示了如何在Windows 平台上使用Win32 API 来处理滚轮事件:c#include<windows.h>#include<stdio.h>WndProc(,,,){ switch(){case:// 处理滚轮滚动事件printf("滚轮滚动了!\n");break;case:// 窗口关闭时的处理PostQuitMessage(0);break;default:// 其他消息的处理return DefWindowProc(,,,);}return0;}int WinMain(,, ,int){// 创建窗口=CreateWindow("EDIT",NULL,|,100,100,500,500,NULL,NULL,,NULL);// 设置窗口过程SetWindowLong(,,());// 消息循环;while(GetMessage(&,NULL,0,0)){TranslateMessage(&);DispatchMessage(&);}return0;}这段代码创建了一个简单的窗口,并设置了窗口过程来处理滚轮事件。
当用户在窗口中滚动鼠标滚轮时,程序会输出"滚轮滚动了!"的信息。
请注意,上述示例仅展示了如何在Windows 上处理滚轮事件的基本概念。
具体的实现方式可能会因操作系统、编程语言和库的不同而有所差异。
如果你使用的是其他操作系统或编程语言,请参考相应的文档和库来处理滚轮事件。
使用C进行Windows桌面应用程序开发Windows桌面应用程序是指能够在Windows操作系统上运行的软件应用程序,通常具有图形用户界面(GUI)且能够提供丰富的功能和交互性。
开发Windows桌面应用程序可以使用多种编程语言,其中C语言是一种常用且强大的选择。
本文将介绍使用C语言进行Windows桌面应用程序开发的基本步骤和相关注意事项。
一、Windows桌面应用程序开发环境的准备在进行Windows桌面应用程序开发之前,首先需要搭建相应的开发环境。
以下是搭建C语言开发环境的基本步骤:1. 安装C编译器:C语言是一种编译型语言,因此需要安装相应的C编译器。
常用的C编译器有GCC和Visual Studio等。
GCC是一款开源的免费编译器,而Visual Studio是微软官方提供的一套集成开发环境(IDE),其中包含了C编译器。
2. 配置开发环境:根据选择的C编译器进行相应的环境配置。
对于GCC,可以通过在命令行中输入gcc命令来进行编译和链接操作。
对于Visual Studio,可以在IDE中创建一个新的C项目,并在项目设置中进行相关配置。
二、Windows桌面应用程序的开发流程在搭建好开发环境后,可以开始进行Windows桌面应用程序的开发。
下面是一个基本的开发流程:1. 确定应用程序需求:在开始开发之前,首先需要明确应用程序的需求和功能。
考虑应用程序的用途、目标用户以及所需的功能和界面设计,有助于后续的开发工作。
2. 编写代码:使用C语言编写应用程序的功能代码。
在编写代码时,可以利用C语言的丰富库函数来实现各种功能,比如文件操作、网络通信、图形界面等。
同时,还可以使用相关的开发工具和框架来简化开发过程。
3. 进行编译和调试:使用C编译器对代码进行编译,并进行调试。
编译过程会将源代码转换为可执行文件,检查并修复代码中的错误和问题。
调试过程是为了定位并解决代码中的BUG(程序错误),可以通过逐步执行、设置断点和查看变量值等方式进行。
C语言的基本语法我是不打算再提了,很多C语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就是一些数值计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且页没有多少实用价值。
本书以实用实例作为编程指导,指引大家编写真正实用的程序。
了解到大家对黑客程序、病毒、窗口类程序比较感兴趣,因此我就拿这些实例进行讲解。
基于大家基本都用Windows XP SP3,我也就在这个系统上把程序调试成功后再给大家讲解。
编程环境,我还是喜欢Visual C++ 6.0本书计划从四个大的方面来讲,这四个方面是:窗口类、文件操作类、网络类、数据库类。
都是时下流行的编程必备技术,也是软件开发者,必须掌握的技术。
中间以实例讲解,逐步学习,相信大家看完后会有很大的提高的。
第一章窗口类程序的编写这一章就先来讲解下窗口类程序的编写。
因为现在程序没有界面,就像人没有脸面一样,而且好的界面更能吸引人。
从基本的界面开始,相信能给大家指明出一条路的,使大家很容易地掌握窗口序的编写。
其实界面设计利用VC 6.0 的MFC,很容易地制作出来。
这里从底层开始写代码来写界面程序,使大家知道一些底层的东西,为以后学习打下好的基础,相信您学了这些,再用VC 的MFC会得心应手的。
1.1用 C 写的第一个一个窗口程序作为编程的开始,我们还是以一个Hello World来开始我们的学习之旅。
代码如下:#include <stdio.h>void main(){printf("Hello World!");}这是一个再简单不过的C程序了,只要有点C语言的知识就能够懂的,不过这里估计还有些人,到现在还不知道#include<stdio.h>中的头文件stdio.h到底是什么东西,我就来说下了,stdio.h是一个文本文件,存在于磁盘上的,已VC为例它的位置如下图:也许你听说过printf()函数是在stdio.h中预定义的,但是你见过其定义的形式没有,没有且看下图其定义形式,就如图中所示,也许你并不懂前面那些东西是什么,不用担心,以后我会慢慢解释给大家的。
函数是先定义才能使用的,所以stdio.h中定义printf函数,我我们在引用了stdio.h头文件后就可以在程序中调用printf函数了。
上面是在命令行中显示一个“Hello World!”,没什么意思,下面我写一个窗口程序,显示个Hello World!#include <windows.h>void main(){MessageBox(NULL," Hello World!","我的第一个窗口程序",MB_OK);}编译运行后如下图:弹出的是一个对话框,上面有Hello World,还有一个标题和一个“确定”按钮。
当然你会说这对话框也算个窗口吗?这里肯定的告诉你:是的,对话框是窗口程序的一个子集。
你可能还会这样问,这样一个简单的窗口有啥用呢,其实这样的窗口非常有用,我们在操作计算机的时候,会出现一些警告或提示的对话框,都是基本是这种方法写出来的。
就算是这个很简单,学习本来不就是有易向难,有浅显深奥去的过程吗。
整个效果几乎就是靠一个函数MessageBox的功劳。
这里也先不介绍这个函数了,说些其他的。
其实用C编写一些恶程序,就是把编程环境中所提供的一些函数熟悉了基本就可以了。
用VC来写成序,其中的头文件有很多,定义了很多Windows API 函数、数据结构、宏,可以让我们大家运用,通过它们,我们可以快速开发出使用的程序。
这些Windows API在微软的MSDN上查,上面有很多说明,部分还有代码示例。
不会是可以输入函数名,查找相关信息,建议大家用英文版的Library,因为其内容比中文版的全面,英语不好的同学呢,就先看中文了中文MSDN:/library/zh-cn/英文MSDN:/library/en-us/到这里,我们就完成第一个有界面程序的编写,你感觉写有界面的程序难吗?显然不难。
下面看一个向锋和波波感兴趣的程序:九九乘法采用命令行形式#include “stdio.h”int i=0,j=0;for(i=1;i<10;i++)for(j=1;j<i+1;j++)printf(“%d*%d=%d \t”,j,i,j*i);printf(“\n”);和那个javascript效果都是一样的,所以语言只要学好一样,其他的就很容易旁通的,学习就捡一种学好,不要贪多。
好的,这一节就这样吧,大家先各自了解下微软的MSDN,对以后的学习会有很大的帮助的。
1.2第一个真正的窗口程序上一节中,我们用MessageBox函数轻松地实现了一个对话框窗口,可能你会说,那仅仅是个没有用的对话框而已,是的,只是对话框而已。
我之所以以一个对话框为例呢,是因为我只是想让你知道写一个有界面的程序并不是件难办的事。
明白了这一点后,我们继续。
今天来编写一个真正的窗口程序。
下面就该罗嗦一段了,由于大家以前并没有写过什么窗口程序,写的都是命令行下的,我们知道在命令行下的程序都有一个主函数main,这个函数也就是程序的入口函数。
我们现在用VC 6.0来写,而且要写窗口类程序,VC 6.0给我们提供了一个专门用作窗口类程序的入口函数WinMain()这个函数原型是这样的int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTRlpCmdLine,int nCmdShow);大家是不是感觉这个函数挺复杂的,有这么几个参数,而像main好像就没有参数。
其实main是有参数,这个向锋和小四是知道了的。
但是main函数的参数是可以省略的,而WinMain是不可以省的。
这里也要对VC 6.0的编译模式改下看下图依次是“工程”→“设置”→“连接”,在“工程选项”里把console改为windows就可以了。
如果认真学了汇编,或是手写命令编译连接过C程序,就会知道这是干什么的。
Console是控制台的意思,以前我们用mian函数写的程序都是以控制台模式连接的,所以很少会有界面的。
现在我们要写有界面的程序,所以要选Windows(窗口)模式了。
我们写入以下代码,并按照上面说的方法去做,看看结果#include "windows.h"int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd){MessageBox(NULL,"WinMain创建的窗口程序","WinMain",MB_OK);return 0;结果如下图:与第一节中的这段代码代码比较下#include “windows.h”void main(){MessageBox(NULL," Hello World!","我的第一个窗口程序",MB_OK);}两者比较下,后者多了个cmd窗口。
可见用main写的并没有完全脱离命令行呀。
所以以后我们写窗口程序就用winmain了。
好了,转过来,我们来看看WinMain()函数,其中有4个参数先看下解释(看不明白得先看完):hInstance:应用程序当前事例的句柄。
hPrelnstance:应用程序的先事例的句柄。
对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。
对于一个32的位程序,该参数总为NULL。
lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。
获得整个命令行,参看GetCommandLine。
nCmdShow:指明窗口如何显示(是隐藏还是显示,有没有最大化按钮之类的)。
取值可以参考MSDN这里我相信有一个词大家好应该比较陌生,句柄(HANDLE)是吧。
下面我就来简单的说下句柄其实就是Windows系统中一个东西的唯一标识。
就是系统中有很多运行的程序或者资源之类的,为了更好的管理使用,Windows系统给它们每人一个ID一样。
懂得网页制作的人应该知道网页中各个元素的ID吧,网页的ID如果重复话可能出现错误。
那么系统的句柄会不会有相同的,那是肯定不会有的了,就和我们的学号一样,系统自动分配每一个模块的句柄,是不会相同的了。
对于句柄大家可以先这样理解着,不用一下子搞懂得。
以后学着学着就明白了。
估计大家对那几个参数的类型改犯迷糊了吧。
其实那几个类型,并不是什么新类型,都是Windows开发人员为了自己和他人编程方便,同过基本的C语言语法定义一种新的结构体,或者是共同体,再者就是枚举类型。
我知道结构体、共同体和枚举类型,很多老师是没有讲到的,因为在书的后边,很多教C的,又是很垃圾的老师,所以不会讲那么快的。
其实结构体这些数据类型,就是通过我们常用的字符、整型、浮点等数据类型构造一个比较复杂的类型而已,举个例子,就是我们知道C没有一个数据类型可以描述一个人吧,那么我构造一个是不是很方便我们编程呢。
我们可以这样构造一个struct People{int age;//年龄char sex[2];//性别int height;//身高……}我们这样定义以后就可以在我们以后的程序中利用这个数据类型了,People zhangsan;把zhangsan的身高172放到zhangsan.height中。
这样可以方便完成很多工作。
所以结构体是很简单的,还有其他的复杂数据类型也是很简单的,都是有常用的简单的类型来结合到一起构造一个复杂的而已。
这和JAVA定义类是很相似的,java定义个人类,不是可以这样的public class People{public int age;public string sex;public height;……}看起来都差不多,而且用法也很相像。
唯一的差别其实就是类可以有方法,而结构体是没有的(经过特殊处理也是可以的,这里不用考虑)。
上面是为了让大家了解下复杂数据类型的定义,罗嗦了一大堆。
下面来看下WinMain中第一个参数的类型HINSTANCE这个只是个结构体而已,实际上和HANDLE这个类型差不多,但是有一点差别,而HANDLE是这样typedef PVOID HANDLE;定义的,PVOID是什么呢,我们来看下typedef void *PVOID;说明PVOID是一个指针,初始指向空(void)。
因此可以知道句柄也是个指针而已。
看着这么复杂原来也只是指针。
这些都可以在微软的msdn上查得到的,而且很详细的那个第二个LPSTR 根据字面上的意思就知道是字符串类型了。