调试《深入浅出MFC》中的例程的心得——从Console到Windows的转换

mfc下调用console程序——四种方法 说明:基于对话框的MFC程序+console程序,vc6.0下。 一、由于在MFC下做了界面,而在Console程序下做的训练和识别部分,而将这部分整合到MFC下很繁琐,所以就在MFC下button控件添加响应函数直接调用console程序的exe。网上有很多人介绍相关知识,主 阅读详情

没有接触MFC以前我总是再考虑Console和Windows程序到底区别在那里,只不过是前者是个16位的程序,后者是个32位的程序,同时具备图形设备的功能,作出图形化的界面,可是读了侯杰的书后,感觉其实二者是相通的,同时借助与强大的vcIDE这里完全可以从一个Console跳转到Windows程序。

《深入浅出MFC》第六章中 MFC程序的生死因果里有一个小的hello例程,别看他及其的不起眼,一开始调试就开始晕了。呵呵

程序的结构:

hello.h文件:

class CMyWinApp : public CWinApp
{
public:
 BOOL InitInstance();
};

class CMyFrameWnd : public CFrameWnd
{
public:
 CMyFrameWnd();
 afx_msg void OnPaint();
 afx_msg void OnAbout();
private:
 DECLARE_MESSAGE_MAP()
 static VOID CALLBACK LineDDACallback(int,int,LPARAM);
};

 hello.cpp  文件:

#include "stdafx.h"
#include "Hello.h"
#include "Resource.h"

CMyWinApp theApp;

BOOL CMyWinApp::InitInstance()
{
 m_pMainWnd = new CMyFrameWnd();
 m_pMainWnd->ShowWindow(m_nCmdShow);
 m_pMainWnd->UpdateData();
 return TRUE;
}
CMyFrameWnd::CMyFrameWnd()
{
 Create(NULL,"Hello MFC",WS_OVERLAPPEDWINDOW,rectDefault,NULL,"MainMenu");
}

BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
 ON_COMMAND(IDM_ABOUT,OnAbout)
 ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyFrameWnd::OnPaint()
{
 CPaintDC dc(this);
 CRect rect;
 GetClientRect(rect);
 dc.SetTextAlign(TA_BOTTOM | TA_CENTER);
 ::LineDDA(rect.right/2,0,rect.right/2,rect.bottom/2,(LINEDDAPROC)LineDDACallback,(LPARAM)(LPVOID)&dc);

}

VOID CALLBACK CMyFrameWnd::LineDDACallback(int x,int y,LPARAM lpdc)
{
 static char szText[] = "Hello,MFC";
 ((CDC *)lpdc)->TextOut(x,y,szText,sizeof(szText)-1);
 for(int i=1;i<50000;i++);
}

void CMyFrameWnd::OnAbout()
{
 CDialog about("AboutBox",this);
 about.DoModal();
}
stdafx.h文件:

#include <afxwin.h>

stdafx.cpp文件:

#include"stdafx.h"

另外还有两个文件用于加载资源:

Resource.h和Hello.rc文件

资源文件里面的描述很繁琐,就直接拿了书后附带光盘的Hello.rc啦,这个不是重要的东西。

好程序敲完后开始编译,我用的工程是win32 console application最原始的方法,我本意是想看看即使建立这样的16位的程序能不能出现windows32位的图形界面的程序。我的想法还是天真了些,编译出了以下错误:

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
libcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Debug06.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

unresolved external symbol _main 这个错误说明没有主函数的入口,的确我用mfc的思想,winmain这个函数是封装在CWinApp类中了,也就是我的一个全局对象成为了程序的入口地址:

CMyWinApp theApp; (CMyWinApp继承了CWinApp类)应该没有问题才对啊。

侯杰的编译方法是写了一个make文件并没有说明在vc的IDE中应该如何去修改编译的参数,没法百度下了,找到一篇价值很高的文档如下:

『引用wuna66320的专栏中写到:
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex


下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows


2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console


3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"Link"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可


4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用』

明白了,原来是在project->setting里修改下即可,转入windows程序呵呵,还真是简单,另外在project->settin->general->Microsoft fundation classes里是禁用mfc的该成静态库就好了,在编译通过呵呵,从console完成了windows程序的跨越

 
VC++6.0项目精讲:从Win32到MFC,掌握Windows桌面开发核心 Windows桌面应用程序开发的核心在于理解其底层运行机制,这通常涉及对Windows API的调用、消息循环的处理以及运行时库的依赖。消息循环是Windows程序的心脏,它负责从系统队列中获取并分发用户输入和系统事件,驱动程序运行。动态链接库(DLL)和运行时库(如MSVCRT)的管理则是确保程序可移植性和部署成功的关键技术,它们解决了代码复用和依赖问题,这也是现代应用(如Flutter桌面端)打包时仍需处理VC++库依赖的根本原因。掌握这些原理,对于维护遗留系统或理解现代框架的底层封装都极具价值。本文将 阅读详情

相关推荐

Visual C++ 2010经典教程:MFC、C++/CLI与遗留系统维护实战指南

C++作为高性能系统开发的核心语言,其与操作系统底层的紧密交互能力是许多关键应用的基础。在Windows平台开发中,微软基础类库(MFC)通过封装Win32 API和消息映射机制,为构建桌面应用程序提供了系统化的框架方案,这一设计思想深刻影响了后续UI框架的演进。对于需要维护金融、工业控制等领域的遗留系统,或深入理解Windows桌面开发原理的工程师而言,掌握特定历史版本的技术栈具有重要工程价值。C++/CLI技术作为连接原生代码与.NET生态的桥梁,在混合编程场景中仍发挥着独特作用。本文围绕Visual

weixin_34274029的博客 319

mfc程序下调用console窗口

这是从网上看到的一个调用console窗口的包装类,贴到这儿备用,呵呵。 ConsolePrinter.h===================================================// ConsolePrinter.h: interface for the CConsolePrinter class.///////////////////////////

zhangxuejie的专栏 1205

MFC项目迁移实战:如何用一份CMakeLists.txt替换臃肿的.sln和.vcxproj文件

本文详细介绍了如何将传统的MFC项目从臃肿的.sln和.vcxproj文件迁移到简洁的CMake构建系统。通过实战案例,展示了CMakeLists.txt的配置技巧,包括字符编码设置、运行时库选项、MFC使用方式等关键参数的转换,帮助开发者实现高效的桌面应用构建和维护。

weixin_30908103的博客 457

在mfc中打开console窗口

在mfc中打开console窗口,备忘。 1 console.h #ifndef __Console_H__ #define __Console_H__ #include stdio.h> #include stdlib.h> #include stdarg.h> #include io.h> #include Windows.h> class Console : pub

WZZZ123的专栏 2449

Visual C++窗体编程资源大全:从MFC到Direct2D的实战源码指南

在Windows桌面应用开发中,窗体(UI)编程是构建用户交互界面的核心技术,其原理基于消息循环、事件驱动和图形设备接口。掌握高效的窗体开发技术能显著提升软件的用户体验和开发效率,广泛应用于企业工具、图形编辑器及系统软件等领域。针对Visual C++开发者常面临的资源零散、示例陈旧等痛点,本文聚焦**窗体**和**源码**两大核心,系统梳理了从经典MFC到现代Direct2D的实战资源。通过精选高质量、可编译运行的示例项目,详细解析了Win32窗口创建、MFC文档视图架构、C++/CLI集成WinForm

jardownload的博客 412

深入解析MFC静态链接库mfcs80u.lib:原理、配置与实战排错

在Windows桌面应用开发中,静态链接与动态链接是两种核心的库依赖管理机制。静态链接将库代码直接嵌入可执行文件,简化部署但增大体积;动态链接则依赖外部DLL,便于更新和共享。MFC(Microsoft Foundation Classes)作为经典的Windows GUI框架,其链接方式直接影响项目的构建和运行。选择静态链接MFC时,程序需要链接特定的静态库文件,例如针对Unicode字符集的mfcs80u.lib。理解字符集配置(如Unicode与多字节字符集)、运行时库选项(/MT、/MD)与MFC使

weixin_33738578的博客 534

VS2010 MFC项目设置cout及printf输出到Console窗口

VS2010的MFC程序本身没有小黑窗,在调试程序时希望打印输出一些变量的值,在VS2010中调出Console窗口。此时在MFC程序中使用cout及printf就可以在小黑窗中打印调试变量的值了。1.鼠标右键项目文件夹选择"属性"。

qq_42416602的博客 2373

Visual C++高级开发实战:Windows平台核心技术与源码剖析指南

Windows平台开发是桌面应用开发的重要领域,其核心在于对操作系统底层机制和图形界面的深度掌控。Visual C++作为微软官方开发工具链,提供了与Windows系统深度集成的开发范式,包括MFC框架、ATL组件库以及对Win32 API的直接调用能力。在工程实践中,掌握这些技术能够帮助开发者构建高性能、高稳定性的原生应用程序,尤其在需要精细控制资源、实现复杂用户界面或进行系统级集成的场景中具有不可替代的价值。例如,通过MFC的文档/视图架构可以快速搭建结构化应用,而Win32 API和COM组件技术则为

weixin_30381317的博客 348

MFC中Console调试输出类(泣血而作)

MFC中Console调试输出类1:本类来源于CodeProject,本人稍加修改,使其使用更加方便。2:使用步骤    1:将该源文件加入到工程    2:在代码任意处调用CConsole::Output("...")调用来输出调试信息。  3:请记得在程序的某处关闭控制台以释放资源3:使用单例模式,_DEBUG选择编译。 附代码:1 头文件:#if !d

破楼兰 3680

深入浅出MFC 书+代码+实例

里面包含MFC书籍代码还有实例,详细的描述了MFC相关知识,对初学者帮助很大。

windows的MFC程序添加console界面

如果你的程序是使用的MFC的界面,但是又需要用console界面进行调试,这个时候就需要像这个程序这样设置和写!

Visual C++ 6.0编程实战:从MFC消息机制到Windows桌面开发核心原理

Windows桌面开发的核心在于理解底层消息循环与图形设备接口(GDI)等基础概念。消息映射机制作为Windows程序的事件驱动基础,通过将用户操作转化为系统消息并分发给对应处理函数,构成了GUI应用的交互骨架。GDI绘图原理则提供了图形渲染的底层支持,涉及设备上下文、坐标变换等关键技术。这些原理不仅是MFC框架的基石,更是现代Qt、WPF等GUI框架共同依赖的技术内核。掌握消息循环与GDI编程,能帮助开发者深入理解Windows桌面应用的运行机制,为维护遗留系统和学习现代框架打下坚实基础。本文通过Visu

long_yu2的专栏 375

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

VC++6.0开发指南:从经典IDE入门到MFC编程实战

C++作为一门经典的编程语言,其核心价值在于对系统底层原理的深刻理解和高效控制能力。在Windows平台开发领域,理解从源代码到可执行文件的完整编译链接过程,以及图形界面应用程序的基本架构,是每个开发者必须掌握的基础。Visual C++ 6.0作为一款经典的集成开发环境,以其轻量、纯粹的特性,成为学习这些底层原理的理想工具。它要求开发者手动配置环境、理解项目结构,这种看似“笨拙”的方式,恰恰能帮助初学者打下坚实的工程实践基础,避免过度依赖现代IDE的自动化功能。在工业控制、嵌入式系统及遗留代码维护等特定场

weixin_34008784的博客 424

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

使用【阿里云百炼】搭建自己的大模型

本文介绍阿里云百炼大模型平台,其为企业级服务平台,融合通义千问等模型,支持多模态能力,提供一站式工具降低开发门槛。重点讲解智能体应用及大模型搭建步骤,含进入创新应用界面、选模型配参数、输指令、导数据、加载知识库、获取API Key、加样例库、配置MCP,还提及模型调试与多平台发布,并附试用链接,助力企业与开发者快速搭建适配业务的AI模型。

Larry的博客 4738

VC++计算器项目实战:从控制台到MFC图形界面的C++开发指南

面向对象编程(OOP)是构建可维护、可扩展软件系统的核心范式,其核心思想在于将数据与操作封装成对象,并通过类与对象间的交互实现功能。在C++开发中,这一原理通过类设计、封装与异常处理等机制得以体现,其技术价值在于提升代码的模块化、复用性和健壮性。在Windows桌面应用开发领域,这一技术广泛应用于需要清晰架构和用户交互的场景。本文以VC++(Visual C++)为开发环境,通过一个基础计算器项目的完整实现,具体展示了如何运用面向对象思想设计核心计算引擎类,并详细阐述了从控制台程序到MFC(Microsof

weixin_34242331的博客 341

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 194

VC++ 6.0深度解析:从MFC框架到遗留系统维护实战

C++作为面向对象编程的核心语言,其编译链接机制和内存管理原理是构建大型软件系统的基石。在Windows平台开发中,理解底层API调用和框架设计对于开发高性能、高稳定性应用程序至关重要。MFC(Microsoft Foundation Classes)框架作为早期Windows C++开发的事实标准,通过文档/视图架构和消息映射机制,极大地提升了GUI应用程序的开发效率。对于工业控制、嵌入式上位机等领域的遗留系统,掌握VC++ 6.0这一经典开发环境,不仅能深入理解PE文件格式、多线程同步等底层技术,更能实

weixin_33853827的博客 393

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3033

05 Transformer 到底解决了什么问题

Transformer 是现代大语言模型的底层骨架。本文不推公式,而是从 CNN、RNN/LSTM 的瓶颈讲起,解释 Transformer 如何通过自注意力同时解决长距离依赖和并行训练问题,并说明它为什么能支撑 GPT、BERT 和现代大模型的规模化。

老于的笔记的专栏 245

VC6.0安装与兼容性配置指南:在Win10/Win11上运行经典开发环境

C++集成开发环境(IDE)是程序员进行软件开发的核心工具,它通过将代码编辑、编译、调试等功能集成于一体,极大提升了开发效率。在Windows平台开发史上,Microsoft Visual C++ 6.0(VC6.0)因其轻量、快速和对MFC框架的深度支持,曾长期是桌面应用开发的事实标准。其技术价值在于为特定历史时期的项目提供了稳定可靠的编译与构建环境。如今,在维护遗留MFC项目或配合经典教材教学等应用场景中,仍可能需要在现代操作系统上部署此环境。本文聚焦于解决VC6.0在Windows 10/11系统上面

congji3817的博客 464

微信小程序启用蓝牙设备特征值变化时的notify功能

注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。

wsk198726的专栏 1172
上一篇: C++深度探索系列:智能指针(Smart Pointer) [二]
下一篇: STLPort库的编译
firectrl
博客等级 码龄20年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值