您的位置:首页 > 编程语言 > C语言/C++

vc++ win32程序中使用MFC

2013-10-23 23:41 155 查看
今天在改一个win32的程序,其中调用了CSOCKET,按以下方法改动项目

1、工程设置中,将MFC的使用由原来的“使用标准windows库”改为“在共享DLL中使用MFC”
如果是英文版,相关选项是:
Microsoft
Foundation Classes: Use MFC in a shared dll, no using
MFC
2、头文件包含
不同的MFC类需包含的头文件是不一样的。
常用的类,如Cstring, Cedit
等,包含afxwin.h就可以了

如果不清楚包含什么头文件的话,可以同msdn进行查询,msdn中,对于MFC类的介绍中,都会给出相应的header
file requirement.
3、#include 语句一定要写在首行

这一点很重要,通常出现前面讲到的windows.h重复包含错误,都是因为#include
语句没有写在首行。
另外还要注意的是,如果#include语句是在一个头文件里,那么对应头文件的包含也要写在首行。示例如下:
=============
test.h文件的内容如下:
#include <afxwin.h>
//保证该语句在首行
test.cpp的文件内容如下:
#include
“test.h” //同样也要保证该语句在首行
=============
如果要用cstring
就包含#include
<afxwin.h>
并且要保证这个包含处于首行

应为要用CSOCKET 所以加入了

if(!AfxSocketInit(NULL))

{

//AfxMessageBox("Could not
initialize Windows Sockets!");

return FALSE;

}

然而报afxwin.inl 21行错误

<!--StartFragment-->是总在trans->Create()处报错,说ASSERT错误:

调试指在下面:

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()

{ ASSERT(afxCurrentInstanceHandle != NULL);

因为CSocket用到一个窗体(WSAAsyncSelect),而该窗体用的是主线程的消息循环,且该窗体没有父窗体和子窗体。

而创建一个窗体需要一个HINSTANCE还有一个消息循环,在dll中应该用的是Dllmain的HINSTANCE,然后再创建一个线程作为消息循环,而CSocket用的却是WinMain的HINSTANCE,和主消息循环。

由于HINSTANCE的错误,CSocket的Create在运行到CWnd::CreateEx是出错。

所再加入以下行

if(!AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0))

{

return FALSE;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: