
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
C语言的学习,一般的方式是,先学C,然后是C++,最好还要有汇编语言和微机原理基础,然后才是Visual C++。这样的方式,对学习者来说,要花费很多时间和耐力。而在学校教学中,也没有时间深入学习Windows编程的实用技术了。
其实,具有了C语言基础后,再有一些基本的C++类的概念,就可以直接学习Windows C编程了。
一、走近Windows C语言
很多语言都把显示一个“Hello,World!”做为第一个入门程序, C语言的第一个程序是这样的:
| #include<stdio.h> main() { printf(“Hello,World!”); } |
| #include<stdio.h> main(int arge,char *argv[]) { printf(“Hello,World!”); } |
| #include<windows.h> APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { MessageBox(NULL,"Hello,World!","第一个Windows C程序",MB_OK|MB_ICONASTERISK); } |
| int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UNIT uType) |
| #include<windows.h> int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { MessageBox(NULL,"Hello,World!","第一个Windows C程序",MB_OK|MB_ICONASTERISK); return 0; } |
这里,我们声明的类型为int型,并且返回一个值0,这样的函数就可以使用在复杂一点的函数调用中了。
在这一节中,我们有几处都提到了句柄的概念,句柄和指针的概念不同,它是作为操作系统内部索引表中的一个值来使用的,这样可以防止应用程序直接访问名对象的内部结构,体现了Windows资源管理的优越性。譬如说,一个窗口找开之后,好对应内存中的一个内存块,这个窗口所在的内存快地址往往会由操作系统做动态的调整,但其却不会随之变化。不过,通过它可以访问这个窗口,所以在使用的时候,可以把它当做指针一样看待。
二、 获取本地计算机的主机名和IP地址
和C语言一样,函数是Windows C编程的最基本的单位。不过,Windows C主要使用API函数,而网络编程则主要使用Winsock提供的API函数。
Winsock是90年代初,为了方便网络编程,由Microsoft联合了其他几家公司共同制定的一套WINDOWS下的网络编程接口,它是通过C语言的动态链接库方式提供给用户及软件开发者的,主要由winsock.h头文件和动态链接库winsock.dll组成,目前有两个版本:Winsock1.1和Winsock2.0。
在Win32平台上,访问众多的基层网络协议,Winsock是首选接口。
用Visual C++6.0编译Windows C程序,使用Winsock API函数时,首先要把wsock32.lib添加到它的库模块中,否刚在链接的时候,会出现“error LNK2001”错误。添加wsock32.lib的具体步骤是:打开工程菜单,选择设置,在弹出的Project settings对话框中,点击link选项卡,然后在对象/库模块文本框中添加wsock32.lib。
最简单的网络编程是获取本机的主机名和IP地址,这个程序使用了WSAStart()、WSAClenaup()、gethostname()、gethostbyname()四个winsock API函数,这四个函数的功能和使用方法介绍如下:
1. WSAStartup():
【函数原型】
| int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); |
| int PASCAL FAR WSACleanup(void); |
| int PASCAL FAR gethostname (char FAR * name, int namelen); |
| struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name); |
| Struct hostent { char FAR * h_name; char FAR FAR ** h_aliases; short h_addrtype; char FAR FAR ** h_addr_list; } |
| #include<winsock.h> int WSA_return; WSADATA WSAData; HOSTENT *host_entry; char host_name[256]; char host_address[256]; int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { WSA_return=WSAStartup(0x0101,&WSAData); if(WSA_return==0) { gethostname(host_name,256); host_entry=gethostbyname(host_name); if(host_entry!=0) { wsprintf(host_address,"%d.%d.%d.%d", (host_entry->h_addr_list[0][0]&0x00ff), (host_entry->h_addr_list[0][1]&0x00ff), (host_entry->h_addr_list[0][2]&0x00ff), (host_entry->h_addr_list[0][3]&0x00ff)); MessageBox(NULL,host_address,host_name,MB_OK); } } WSACleanup(); return 0; } |
| BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); |
| #include<winsock2.h> #include"Get_IP.h" #include"resource.h" //这个头文件在创建资源的时候会自动生成, //并会在插入资源时自动生成控件标识号. int WSA_return; WSADATA WSAData; HOSTENT *host_entry; char host_name[256]; char host_address[256]; int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { WSA_return=WSAStartup(0x0101,&WSAData); if(WSA_return==0) { gethostname(host_name,256); host_entry=gethostbyname(host_name); if(host_entry!=0) { wsprintf(host_address,"%d.%d.%d.%d", (host_entry->h_addr_list[0][0]&0x00ff), (host_entry->h_addr_list[0][1]&0x00ff), (host_entry->h_addr_list[0][2]&0x00ff), (host_entry->h_addr_list[0][3]&0x00ff)); } } WSACleanup(); DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)Hostname_ipDlgPro); return 0; } BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam) { switch(message) { case WM_INITDIALOG: return(TRUE); case WM_COMMAND: if(LOWORD(wParam)==IDOK) { SetDlgItemText(hDlg,IDC_EDIT1,host_name); SetDlgItemText(hDlg,IDC_EDIT2,host_address); SetDlgItemText(hDlg,IDCANCEL,"确定"); } if(LOWORD(wParam)==IDCANCEL) EndDialog(hDlg,TRUE); return(TRUE); break; } return(FALSE); |
三、利用VisualC++6.0编译Windows C程序
利用Visual C++6.0编译Windows C程序一般要经过以下四个步骤:新建项目、添加代码、添加资源和编译链接。下面我们简单地介绍一下程序上面介绍的规范的获取本机的主机名和IP地址程序的编译过程:
(一) 新建项目
1.启动MicrosoftVisualC++,然后在【文件】菜单中先择【新建】命令,弹出如图1所示的【新建】对话框:
![]() 图1 |
![]() 图2 |
![]() 图3 |
![]() 图4 |
![]() 图5 |