MFC 开发中一些报错的解决方法

万事开头难,新入坑时,很多简单的报错都要花较长的时间精力去解决,身边没有大佬带也只能时间换经验,自己查找解决方法。为了减少时间的无效消耗,必须得系统地学习基础,视频教学是比较适合新入坑的,然后再转到书籍。C++ 比较难,加上老旧的 MFC 就变得难上加难,让你左右为难。总结一下这些报错的解决方法,以祭奠曾因此逝去的青春。

(1)error C2440: “初始化”: 无法从“const char [x]”转换为 xxx wchar xxx
比如:

CString str = "Hello, world!";

就会报这样的错误,使用 _T() 把这类非变量字符串包括即可解决,使用 TEXT() 或者 _TEXT()是一样作用 。

CString str = _T("Hello, world!");

_T() 是一个宏,当处于 Unicode 字符集下自动加 L() ,加 L() 定义字符串为 Unicode 编码。虽然把项目改成多字节可以直接不用这么麻烦,但为了兼容,不出现乱码等问题,还是建议使用 Unicode 统一码。

(2)MFC 程序打开报错,提示:由于找不到MFC42D.DLL,无法继续执行代码。重新安装程序可能会解决此问题。
① 这类提示缺失 DLL 动态库 带有 mfc、ms、vb 等相关字母的是微软类库,一般是编译程序时没有选择“在静态库中使用MFC”,在其他电脑运行时出现。

如果选择“在静态库中使用MFC”编译的程序,还是出现此类报错,那就是系统有缺失,可以搜索微软常用运行库合集 ,安装即可解决。

② 如果按照 ① 的操作后还是出现 DLL 缺失报错,那就不是微软常用运行库了,可能是项目另外引用的,可在项目中查找或者搜索下载过来,放在和 exe 程序同一路径中,比如同一文件夹,具体视源码中的调用路径而定。

(3)Debug 调试运行时提示 xxx occcont.cpp line:925 错误

这类一般是 程序使用了某个 OCX 控件,但是在本电脑上未注册该控件。找到该控件,以管理员方式运行 CMD 命令注册即可,注意改为 OCX 控件所在的对应路径:

regsvr32 D:\Users\Desktop\xxx.ocx

如果提示注册成功后,还是出现此错误,那大概是 Debug 调试运行时选错平台了,比如 x86 的项目,运行成了 x64 , 控件也分 32 位和 64 位。

(4)使用高版本的 VS ,升级 VS 工程后,资源视图的 .rc 资源打不开,报错 error RC2104:undefined keyword or key name: xxx
编辑.rc 源文件,加入头文件: #include <windows.h>

(5)error C4996: 'scanf': xxx
C4996 错误是使用了 C 语言标准的函数,在高版本 VS 中会由于不安全报错,使用安全函数 scanf_s 即可解决,在原函数后加 _s ,其他如 printf、strcpy 也一样,虽然可以添加预处理器命令或宏定义屏蔽掉来解决,但不建议这么做。

(6)error C2065: “xxx”: 未声明的标识符
①一是因为未申明的变量直接使用产生,比如直接使用了 int型的 num ,而没有提前申明 int num;
②二是未定义命名空间,使用 cout 、cin 这类没有先定义。

#include "stdafx.h"
#include <iostream>
//using namespace std; //①未定义命名空间会报错,偷懒用法,大型项目不建议用,建议使用②

int main()
{
    int num;   //未申明直接使用 num 会报此错误
    num = 3;
    std::cout << "dd" << std::endl;// ②定义命名空间,加 std:: 

    return 0;
}

(7)error LNK2019: 无法解析的外部符号 xxx1 该符号在函数 "xxx2" 中被引用
这种情况是在头文件申明了函数 xxx1 ,但未定义,直接在 xxx2 中使用了,解决方法是在对应 cpp 源文件定义 xxx1 函数。
如果是隐式调用DLL时报错,那看看是否忘了包含对应 lib。

(8)串口通讯使用 MSCOMM32.OCX 控件,大于 16 的串口端口号会无法正常通讯, 打开时报错无效串口号: invalid port number
控件自身限制可最大端口号为 16,需使用十六进制编辑器或直接用 Sublime 等编辑器打开 ocx,在 1179 行找到 "3d10",将其中的 10 改成 FF ,即可支持最大端口到 255 ,足够应付任何情况了。

标签: MFC开发 报错解决

选择表情