回 帖 发 新 帖 刷新版面

主题:以MFC AppWizard(exe)工程中手工添加WinSocket支持为例研究#Include

MFC AppWizard(exe)工程中手工添加WinSocket支持的研究
也是对文件包含的研究了

[b]一.为什么我们会要手工添加WinSocket的支持[/b]
我们知道通过MFC AppWizard(exe)创建工程时,只要在向导中使Windows Sockets打勾就可有WinSocket支持。这样我们这可以用如CSocket等类来创建对象了。(以下以对话框程序为例分析,工程名为MFCEXE。)
但是我们创建工程时,如果没有对Windows Sockets打勾,那么就无法用CSocket类了。这里我又想使用CScoket类那应怎么办呢?

[b]二.添加WinSocket支持的实质[/b]
重新创建工程?那不是好办法。我可要将大量原工程的代码“搬”到新工程去,太麻烦了。
怎么办啦?请告诉我啊!
好了,我们现在来看看创建工程时向导中选中Windows Sockets时,代码中添加了什么。打开StdAfx.h文件看。多了如下一行
#include <afxsock.h>        // MFC socket extensions
哦,原来只要在使用代码的地方包含这么一个头文件就可啦。那就是afxsock.h文件。那么我再自己的工程中的StdAfx.h中也添加相同一句。然后再主对话框类中添加一个数据成员:CSocket m_Scocket。编译一下,一切OK了。

[b]三.包含#include的先后顺序[/b]
不过我想还想理解文件的包含技巧,我想进一步实验一下。 我不在StdAfx.h中包含,而只在用到CSocket的地方才包含它。
在什么地方会用到呢?在主窗口类的头文件MFCEXEDlg.h中有用到。那么就在MFCEXEDlg.h的开始处包含吧。编译执行一下,可以啦。但是一个头文件包含另一个头文件的方法不好,尽量不要这样的包含,因为这样会可能出现头文件重复包含的问题。
另一种方法是可在实现文件MFCEXEDlg.cpp中包含afxsock.h文件,如下:
// MFCEXEDlg.cpp
#include "stdafx.h"
#include "MFCEXE.h"
#include "MFCEXEDlg.h"
#include <afxsock.h>        // MFC socket extensions本行是我添加的

编译试试,不成。原来MFCEXEDlg.h的包含先于afxsock.h的包含。把它们对调一下试试。还是不行。想想还有什么不对吗?哦!原来MFCEXE.cpp的文件中的应用程序类有调用到对CMFCEXEDlg对话框类。还得包含afxsock.h,于是添加如下:
// MFCEXE.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "MFCEXE.h"
#include <afxsock.h>        // MFC socket extensions本行是我添加的
#include "MFCEXEDlg.h"

编译试试,终于成了。不过,这样包含的方法,[b]我们在包含MFCEXEDlg.h时一定不能忘记在其前还要包含afxsock.h文件。[/b]这样的包含方法看来还是不尽人意了。看来还是在stdafx.h中包含afxsock.h的方法更好一点了。
通过这样的试验,我终于明白了包含的含义并掌握了一定的技巧。高兴之于,愿与同好者共享,也望请各位高手多多指点啦!

回复列表 (共3个回复)

沙发

光包含头文件是不够的,还应该进行初始化之类的操作.
其实程序员指南里对每个步骤都写的很清楚.

板凳

菜鸟感谢你!

3 楼

你只发现了其一,没发现其二,
MFC程序在CMyApp类的开始和结束处还各加了一个函数。

我来回复

您尚未登录,请登录后再回复。点此登录或注册