`
in355hz
  • 浏览: 229897 次
社区版块
存档分类
最新评论

在 Win32 Application 中使用 MFC

阅读更多

Virtual C++ 6.0 创建的 Win32 Application Win32 Console Application 中使用 MFC 是可能的,主要的困难在于绕过 MFC 提供的 WinMain 函数。下面我提供一个方法以供参考:

 

进入 Project-->Setting--> C/C++ Page ,做以下修改:

 

1.    Preprocessor definitions 中加入 _AFXDLL ,加入后的设置大概是这样的:

 

WIN32,_DEBUG / NODEBUG,[_CONSOLE],[_MBCS],_AFXDLL

 

加入的 _AFXDLL 是关键 ,它欺骗 MFC LIB ,避免连接 MFC WinMain 函数。

 

2 修改 Project Options ,将 /MT 或者 /ML 标志改为 /MD

原因是在 afxver_.h 中会检查 _AFXDL, _MT, _DLL 标志是否同时设置,否则报错。尽管链接 For Multi-Threaded 版本的 Library 会损失一些性能,但是这个标志的存在并不导致编译器把 Project 编译成 DLL

 

3.  Project stdafx.h 中包含必要的头文件,或者直接从 MFC AppWizard 创建的 stdafx.h 中拷贝:

 

#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers

      

#include <afx.h>

#include <afxwin.h>         // MFC core and standard components

#include <afxext.h>         // MFC extensions

#include <afxdtctl.h>           // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h>                  // MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

 

4.  Project WinMain / main 中加入 MFC 的初始化代码,以下是 _tWinMain _tmain 的情况:

 

extern "C" int WINAPI

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

       LPTSTR lpCmdLine, int nCmdShow)

{

       int nRetCode = 0;

 

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

       {

              TRACE0("Fatal Error: MFC initialization failed.\n");

              nRetCode = 1;

       }

       else

       {

              // Actual WinMain codes ...

 

              AfxWinTerm();

       }

 

       return nRetCode;

}

 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

       int nRetCode = 0;

 

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

       {

              cerr << _T("Fatal Error: MFC initialization failed") << endl;

              nRetCode = 1;

       }

       else

       {

              // Actual main codes ...

 

              AfxWinTerm();

       }

 

       return nRetCode;

}

 

此外,在 Virtual C++ 6.0 创建的 Win32 Dynamic-Link Library 中也可以单独使用 MFC ,这样可以避免 Project MFC AppWizard ATL COM AppWizard 添加 CWinApp 实例,方法简单,如下构造 Project DllMain 函数即可:

 

#include <afxdllx.h>

 

static AFX_EXTENSION_MODULE ProjectDLL     = { NULL, NULL };

 

extern "C" int APIENTRY

 

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

{

       // Remove this if you use lpReserved.

       UNREFERENCED_PARAMETER(lpReserved);

 

       if (dwReason == DLL_PROCESS_ATTACH)

       {

              // Extension DLL one-time initialization.

              if (!AfxInitExtensionModule(ProjectDLL, hInstance))

              {

                      TRACE0("Project.DLL initialize its extension module failed!\n");

                      return FALSE;

              }

              

              // CDynLinkLibrary’s destructor will be called in AfxTermExtensionModule.

               new CDynLinkLibrary(ProjectDLL);

       }

       else if (dwReason == DLL_PROCESS_DETACH)

       {

               TRACE0("Project.DLL terminating...\n");

              // Terminate the library before destructors are called.

               AfxTermExtensionModule(ProjectDLL);

       }

 

       return TRUE;   // ok.

}

 


注: 有网友指出 VC7 中, 需要将第一步的 _AFXDLL 改成 __PROF 则同样可以编译。

分享到:
评论

相关推荐

    Win32 控制台中使用 MFC.zip

    在Virtual C++ 6.0创建的Win32 Application 和 Win32 Console Application 中使用 MFC 是可能的,主要的困难在于绕过MFC提供的WinMain函数。下面我提供一个方法以供参考:

    win32和win32 console和MFC程序概况

    根据给定的部分内容,我们可以看到在Visual C++ 6.0中创建的Win32 Application和Win32 Console Application中使用MFC的具体步骤: 1. **预处理器定义**:为了绕过MFC提供的`WinMain`函数,我们需要在预处理器定义中...

    使用VC6.0开发Win32 Application程序

    在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)这个经典且功能强大的IDE来开发Win32应用程序。Win32 Application是Windows操作系统平台上的本地应用程序,它利用Windows API(应用程序接口...

    Win32项目使用MFC的模版

    在Windows平台上进行C++开发时,Microsoft...以上就是关于在VS2010的Win32项目中使用MFC模版的基本步骤和相关知识点。通过这个过程,你可以创建出具备MFC特性的应用程序,利用其丰富的类库和强大的功能,提高开发效率。

    MFCApplication1.zip_MFC_MFCApplication1.exe_c++ mfc application_

    在标题"MFCApplication1.zip_MFC_MFCApplication1.exe_c++ mfc application_"中,我们可以推断这是一个基于C++语言,使用MFC框架构建的应用程序,其可执行文件名为"MFCApplication1.exe"。描述中的“通过C++和MFC...

    win32基础学习 MFC

    Win32 API(Application Programming Interface)是微软Windows操作系统的核心组件,为开发者提供了与操作系统交互的接口。...在实际项目中,掌握Win32 API和MFC的应用,可以极大地提高开发效率和代码质量。

    Win32 空项目 创建MFC SDI

    在这个场景中,我们将探讨如何使用Visual Studio 2010创建一个基于Win32的空项目,并逐步将其转化为一个MFC SDI程序。 首先,启动Visual Studio 2010,选择"文件" -&gt; "新建" -&gt; "项目"。在项目类型中,选择"Win32 ...

    在控制台中使用MFC.zip

    在Virtual C++ 6.0创建的Win32 Application 和 Win32 Console Application 中使用 MFC 是可能的,主要的困难在于绕过MFC提供的WinMain函数。下面我提供一个方法以供参考:

    win32API手册+MFC类库+Windows程序设计

    首先,Win32 API(Application Programming Interface)是微软为Windows操作系统提供的核心接口,开发者可以通过调用这些API函数来实现各种功能,如文件操作、进程与线程管理、内存分配、网络通信等。例如,`...

    Win32 API帮助文档以及MFC 中文类库详解

    Win32 API(Application Programming Interface)是微软Windows操作系统的核心接口,它为开发者提供了与系统进行交互的函数调用。这些函数涵盖了操作系统的核心功能,包括窗口管理、图形绘制、内存管理、网络通信等...

    Win32动态链接库:实现在Win32 DLL中使用对话框资源动态链接库应用范例

    在Visual Studio中,可以选择"Win32 Console Application"项目模板,然后在向导中选择"Dynamic Library (.dll)"作为项目类型。在DLL项目中,我们需要定义导出函数,这些函数将在调用DLL的应用程序中使用。导出函数...

    MFC.rar_win32

    在Win32应用程序开发中,MFC提供了一系列的类,如CWinApp、CWnd、CDialog、CButton等,这些类对应于Windows编程中的各种对象,如应用程序对象、窗口对象、对话框对象以及控件对象等。使用MFC可以大大简化对Windows...

    WIn32-MFC.zip

    综上所述,WIn32-MFC.zip中的资源全面地涵盖了Windows 32 API和MFC框架的核心知识。通过学习这些资料,开发者不仅可以深入理解Windows编程的底层原理,还能掌握使用MFC进行高效应用开发的技巧。无论是初学者还是经验...

    MFCApplication.zip

    MFC是Microsoft为Windows平台提供的C++类库,它简化了Win32 API的使用,使得开发者能够更高效地构建桌面应用程序。在MFC中,进度条控件是通过`CProgressCtrl`类实现的,它是Windows API中的`CreateProgressCtrl`函数...

    API对话框------Win32 DialogBased Application插件的安装

    本文将详细介绍如何在不同版本的Visual Studio(如VC6和VC2008)中安装和使用这个插件,以及如何手动创建一个Win32 Dialog-Based Application。 首先,让我们了解Win32 Dialog-Based Application的基本概念。对话框...

    MFC类库详解+WIN32API

    MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化...而在某些特定场景下,直接使用Win32 API可以实现更底层、更高效的定制。因此,理解两者的结合使用,对提升Windows应用开发能力至关重要。

    MFCApplication2可用com口.zip

    CSerialPort是MFC对Win32 API串口通信功能的封装,提供了诸如打开、关闭串口,设置波特率、数据位、停止位、校验位,以及发送和接收数据等方法。 首先,我们需要理解串口通信的基本概念。串口通信是一种异步通信...

    Win32下HTTP请求

    在Win32 API中,我们可以使用send函数将构造好的HTTP请求字符串发送到服务器。接收服务器响应时,使用recv函数读取数据,注意处理好缓冲区大小和接收循环,确保接收完整个响应。 对于中文乱码问题,关键在于确保...

    win32动态库创建与调用

    2. **添加MFC支持**:在项目属性中,选择“MFC”选项,选择“在静态库中使用MFC”或“在共享DLL中使用MFC”,根据需求决定是否需要将MFC库一起打包进DLL。 3. **编写函数**:在头文件中声明对外公开的函数和类,...

Global site tag (gtag.js) - Google Analytics