
VC++
文章平均质量分 82
-飞鹤-
喜欢音乐,喜欢文学,喜欢跑步,喜欢编程!
展开
-
Visual Studio调试C/C++指南
前言Visual Studio(VS)是微软开发的一款集成开发环境(IDE)软件,支持C/C++、C#、VB、Python等开发语言,开发桌面、Web等应用程序。VS功能极其强大,使用极其便利,用户数量最多,被誉为"宇宙第一IDE"。熟悉地掌握基于VS的C/C++调试技术,可以大幅提升调试性能。随着VS版本的更新,其功能越来越强大,本文的内容是基于VS2019进行验证测试的,之前版本VS可能有少量特性不支持。基础。原创 2024-04-18 13:24:13 · 6401 阅读 · 0 评论 -
MSVC++远程调试
MSVC++的调试功能非常强大,可以下断点,单步调试,查看堆栈变量信息等。实际用于生产的电脑环境复杂,更容易发生Bug。生产电脑,由于各种原因有些可能无法安装MSVC用来现场调试。基于打印日志,查看日志的方式来分析,一些简单的问题可以解决,但是一些复杂的问题,尤其是语法问题,还是在线调试更方便。针对上述情形,跨电脑的远程调试就出现了,完美解决上述问题。远程调试,一台生产电脑,一台开发电脑,共同接入一个局域网。开发电脑远程连接生产电脑,然后就像调试本地程序一样调试运行于生产电脑上的程序。原创 2024-02-01 16:03:04 · 1047 阅读 · 1 评论 -
Windows消息队列及C++应用
Windows是一个消息驱动的操作系统,消息是用一个常量标识符来标记,并且有两个32Bit的消息附加信息。单击鼠标、敲击键盘,都会通过电脑外设向系统发送特定的中断信号,这个中断信息在操作系统中会转化为一个消息,并存储在系统的一个消息队列中。Windows操作系统会根据当前激活的窗口与鼠标、键盘的操作来决定将消息发给相应的窗口线程。针对非UI线程,可以通过PostThreadMessage来传消息,但是耦合性高。更方便的方式是通过Hook来直接获取指定窗口的消息。原创 2022-10-04 22:54:48 · 2768 阅读 · 0 评论 -
基于MFC的MVC框架的编程实践
Windows桌面应用的开发,C++语言依然占据着主流。用C++开发桌面应用,面临UI框架的选择,主流的C++ UI框架有MFC,DUI,Qt,cef。它们各有各的优势。MFC,制作简单的UI非常容易,因为MFC并不完全开源,所以想深度美化MFC UI,难度非常大,多用于一些对UI效果要求不高的工业控制软件。DUI(Direct UI),即直接绘制的UI,所有的控制部件都是通过GDI/GDI+绘制的,因为其开源,如果想自定义一些控件,也会更容易一点。...原创 2022-08-12 14:37:44 · 1887 阅读 · 0 评论 -
MFC Dialog/MDI应用程序转换为DLL
基于MFC框架的应用程序,一般的*.exe程序都是基于Dialog/MDI的。如果想在Dialog/MDI模块中隐式调用*.dll,则*.dll必须与*.exe在同一级目录。如果想把所有的*.dll都移到DLL目录中,有什么办法呢?因为隐式调用要求调用模块与被调用模块必须在同一目录,也即*.dll与Dialog/MDI模块必须在同一目录,也即需要将Dialog/MDI模块从exe改为DLL。1. Dialog应用程序转换为DLL1.1. 创建Dialog Dll工程创建Dialog工程。将D原创 2021-04-09 11:39:42 · 914 阅读 · 0 评论 -
Windows下的C/C++的远程调试
1. 问题程序员经常会面临,开发电脑上一切运行正常,但是在测试电脑上却死活都有问题。一般情况下,我们可加一些弹窗或是打印Log来进行分析调试。但是如果问题复杂时,以上方法调试还是比较麻烦。如果可以像开发电脑一样,可以单步运行,并可以查看各种变量、堆栈信息,那就非常方法。有人直接在测试电脑上安装编译调试工具,但是有时问题是出现在客户电脑上,此时去安装相关编译调试工具,就非常不方便。那么有没有一种方法,不用安装Visual Studio,就能方便地直接对测试电脑进行调试呢?另外,Windows内核程序的调试原创 2020-10-31 18:16:46 · 1389 阅读 · 0 评论 -
Windows下的字符编码字符集及应用
1. 基础1.1. 字符编码字符编码(Character encoding),计算机的CPU计算、硬盘存储、显示器都是以数字信号存在的。那么所有显示的字符(无论是英文字符、还是中文字符)都是以数字来表示的。字符编码即统一套标准来在不同计算机之间存储传递信息。这一套以数字表示字符的过程,就是字符编码过程。1.2. 字符集字符集(Character Set),世界上有很多种文字,每种文字都有一套自己的字库。很多国家为了让计算机正常显示自己的文字,发明了套字符编码方式。这样每个字都有一个数字编码相对应。这原创 2020-08-18 17:41:17 · 7428 阅读 · 0 评论 -
Windows下C++防止进程多开
1. 概念防止进程多开,一般是特指防止同一个exe进程重复打开。为什么要防止进程多开呢?功能设计上不让用户打开两次,如各种游戏客户端。防止多进程对资源访问的冲突。如当前进程对某文件可能在进行写读操作,再打开新进程时可能的写读操作会导致出现文件访问异常甚至崩溃。2. 方法网上很多资料推荐利用遍历窗口来判断,如果找到对应的窗口则认为进程已经打开。这种方法其实存在很大的风险。窗口创建的过程中可能因为系统消息阻塞导致创建很慢,那么在窗口创建过程中再打开进程,并通过遍历窗口来判断则可能失败。窗口关原创 2020-06-29 19:37:36 · 2653 阅读 · 0 评论 -
c++窗口嵌入第三方进程窗口
现在的大型软件启动之后,很可能存在多个进程。如浏览器,每打开一个新的页面,就会启动一个新的进程。为什么会使用多进程,而不是全部使用多线程呢?因为多进程,可以做到完全的隔离,这样的好处是:如果一个页面卡死了,不会干扰到其他页面;在代码层,也少了多页面之间线程变量安全考虑的顾忌了,不用考虑同步异步等操作。我们在MainUI中嵌入ThirdUI窗口,主要有以下步骤:1. 打开第三方进程窗口主要通过CreateProcess函数来打开第三方进程,并获取进程ID。HWND CNestWndDlg::Open原创 2020-06-15 18:57:34 · 4288 阅读 · 3 评论 -
Manifest文件详解
Madifest是个XML的描述文件,对于每个DLL有DLL的Manifest文件,对于每个应用程序Application也有自己的Manifest。对于应用程序而言,Manifest可以是一个和exe文件同一目录下的.manifest文件,也可以是作为一个资源嵌入在exe文件内部的(Embed Manifest)。XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的d原创 2017-02-06 20:54:59 · 38596 阅读 · 0 评论 -
C++函数调用的反汇编过程及Thunk应用
x86汇编基础知识1. 汇编常用寄存器esp,(Extended stack pointer)栈顶指针。因为x86的栈内存是向下扩展的,因此当push入栈时,esp–。pop出栈时,esp++。esp主要维护当前栈。ebp,(Extended Base Pointer)栈基地址。一般都是在函数入口时,保存前函数的ebp,并将esp赋值给ebp,然后通过ebp来操作形参和临时参数。eax,(Ex原创 2017-06-08 17:28:48 · 1432 阅读 · 0 评论 -
C++数组概述
C++数组概述基本概念1. 数组是固定大小的一种复合类型因为数组是固定大小,所以在编译期间就决定了基大小数组的内存是连续(无论是一维数组还是多维数组)2. 数组的特性数组之间不允许拷贝和赋值 数组名是常指针数组的操作1. 数组的初始化数组定义时不初始化,则会被初始化为未初始化值int nArr[4]; // 当数组为全局变量时,未初始化值默认为0;当数组为局部变量时,则其值在Debu原创 2017-06-26 17:42:28 · 485 阅读 · 0 评论 -
自定义VS程序异常处理及调试Dump文件(一)
1. Dump文件1. Dump文件介绍Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中记录信息也自然有所不同。2. Dump文件分类程序分两种,内核模式程序和用户模式程序,也即Ring0程序和Ring3程序。Dump文件是伴随着程序而生成原创 2017-07-17 12:31:36 · 3364 阅读 · 2 评论 -
C++字符串数字转换以及字符串匹配处理
1. 字符串转换为数字1.1. 简单转换double atof(const char *string);double _wtof(const wchar_t *string);int atoi(const char *string);__int64 _atoi64(const char *string);int _wtoi(const wchar_t *string);_...原创 2018-06-30 18:26:10 · 929 阅读 · 0 评论 -
MFC下更改窗口的默认类名(ClassName)
1. 类名(ClassName)每个能CWnd派生的类,都有一个ClassName,可以通过GetClassName 获取,如对话框的ClassNmae是#32770,按钮的ClassNmae是Button。通过FindWindow,指定className可以更快速地找到相应的窗口句柄。HWND FindWindow( LPCTSTR lpClassName, L...原创 2019-09-07 18:39:18 · 4923 阅读 · 0 评论 -
PreTranslateMessage处理模态窗口和非模态窗口
1. 非模态窗口,如控件即为非模态窗口。 BOOL CProgressEdit::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_LBUTTONUP) { // Do something return FALSE; } return CStatic::PreTranslateMessage(pM...原创 2019-09-23 09:28:57 · 1218 阅读 · 0 评论 -
PDB文件详解
PDB文件的介绍PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。PDB文件的调用过程模块(Module),EXE和DLL都可以称之为模块,因为它们都有...原创 2017-01-08 14:25:31 · 70638 阅读 · 3 评论 -
C++模板常用功能讲解
前言泛型编程是C++继面向对象编程之后的又一个重点,是为了编写与具体类型无关的代码。而模板是泛型编程的基础。模板简单来理解,可以看作是用宏来实现的,事实上确实有人用宏来实现了模板类似的功能。模板,也可以理解为模具行业的模型。根据分类,有函数模板和类模板。根据传入的不同模板参数,函数模板会生成不同模板函数。类模板则生成不同的模板类。 模板参数1. 概念模板定义以关键字tem原创 2016-10-24 11:49:34 · 782 阅读 · 0 评论 -
C++数组类模板
* 作为数组类模板,肯定没有vector做得好,但是普通的数组有1个好处就是能直接操作内存,vector在这方面就不是很方便了。网上虽然也有数组类模板,多维的设计基本上都不是很好。我这个类模板多维的设计借鉴了vector,如2维数组vector> vvArr;下附源码*/#pragma onceenum E_POSIITION{ begin_position = 0,原创 2014-06-09 22:57:22 · 1182 阅读 · 0 评论 -
重载()运算符和重载强制类型转换
// 研究了半宿,终于弄清楚了// 写了这段测试代码可以很好的演示效果class CConvert{public: CConvert(){m_nValue = 10;} // 重载()运算符 int operator ()(); // 重载int强制类型转换 operator int();prot原创 2014-06-09 23:07:26 · 2462 阅读 · 0 评论 -
sort函数中的参数之判定函数对象
sort函数在algorithm文件中被重载为两个函数。 函数 1:template inlinevoidsort(_RanIt _First, _RanIt _Last){ //order [_First, _Last), using operator_DEBUG_RANGE(_First,_Last);_Sort(_CH原创 2014-06-02 22:08:09 · 1765 阅读 · 0 评论 -
C++之DLL详解
基本上涉及到了VC++编写DLL经常使用的大部分内容,主要面向有一定工作经验的VC++程序员,以实用为主,言简意赅.希望看过这篇文章的程序员人能够不再为DLL的编写烦心了.原创 2014-05-14 22:36:22 · 3800 阅读 · 0 评论 -
windows下文件的监控--ReadDirectoryChangesW函数的使用
1.FindFirstChangeNotification()函数:功能:创建一个改变通知句柄,并设置通知条件,即发生某种修改时,该通知句柄将被促发生效。该函数仅仅负责对文件修改作出通知,并不记录和反馈修改信息,ReadDirectoryChangesW()函数可以返回修改新的信息,参考第二部分。函数参数:[cpp] view plaincopy转载 2014-10-24 18:17:07 · 1893 阅读 · 0 评论 -
C/C++的参数传递机制
近来公司招人较多,由此面试了非常多的C++程序员。面试时,我都会问到参数传递的相关问题,尤其侧重指针。因为指针毕竟是C/C++最重要的一个优势(在某种情况下也可以说是劣势)。但其结果是,1/3的人基本上讲错了,1/3的知其然却不知其所以然。所以我觉得有必要把这些知识点梳理下,分享出来。(下面的讨论都是基于VS和GCC的默认编译方式,其他特殊编译方式不在本文作用范围内。) C/C++函数参数原创 2015-01-11 15:10:20 · 1012 阅读 · 0 评论 -
C++ Traits技术
要想深入的理解STL的迭代器、分配器等,就必须了解C++模板编程中的一个技巧——Traits。1、问题的提出C++的模板特性为泛型编程提供了支持。这样我们就可以编写更加通用的代码,而不必过分去关心参数的类型。然而事实却是,类型的不同,很多时候却影响到了算法中的某个小小的实现。举个标准库里的类string,wstring。其实它们对应的是两个模板,前者单字符,后者宽字符。原创 2015-05-10 09:52:01 · 3634 阅读 · 1 评论 -
关于MFC库和CRT库冲突的分析
首先我们来认识下这些错误中提示的信息:nafxcwd.lib,MFC静态链接库,调试版。(发布版是nafxcw.lib)LIBCMTD.lib,多线程版的CRT库。DLLMain函数,在dllmodul.cpp和dllmain.cpp中都有定义。new、delete、delete[],CRT库中有一套标准实现,但是MFC中均重新实现了一遍。那么上面的错误的意思即是,已经链接过LIBCMTD.lib,再链接nafxcwd.lib即会报重复定义的错误。对于MFC工程中的DllMain,new, de原创 2015-07-17 19:39:39 · 1726 阅读 · 0 评论 -
C++变量内存分配及类型修饰符
前言了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期。另外,变量类型修饰符也会影响到变量的初始化值及其生存周期。掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变量时更准确。 内存分配1. C++程序的内存布局现代电脑都是遵循冯诺依曼体系结构,所以C++程序的内存布局也是遵循该体系的。主要包括5个部分,即代码段、数据段原创 2016-01-24 21:37:17 · 704 阅读 · 0 评论 -
VC的常用调试方法
前言VS是非常强大的IDE,所以掌握VSVC的常用方法,将会使得我们找出问题解决问题事半功倍。目录VSVC的常用调试方法前言1. Watch窗口查看伪变量2. 查看指针指向的一序列值3. 内存泄露查找4. 调试Release版本5. 远程调试6. 函数断点7. 数据断点。8. 代码执行时间9. 格式化数据10. 格式化内存Watch窗原创 2016-02-15 21:46:55 · 1031 阅读 · 0 评论 -
VSVC2010中常用的C++11特性
static_assert声明static_assert 声明在编译时测试软件断言,这与在运行时进行测试的其他断言机制不同。 如果断言失败,则编译也将失败,且系统将发出指定的错误消息。const int nValue = 3;static_assert(nValue 这样编译时就会报出Error的错误提示信息。declty原创 2016-04-20 23:10:19 · 3142 阅读 · 0 评论 -
Windows下多线程编程(一)
前言熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常。Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求。进程与线程1. 进程的概念进程就是正在运行的程序。主要包括两部分:• 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。• 另一个是地址空间原创 2016-05-08 23:33:59 · 2671 阅读 · 0 评论 -
Windows下多线程编程(二)
线程的分类1. 有消息循环线程 MFC中有用户界面线程,从CWinThread派生出一个新的类作为UI线程类CUIThread,然后调用AfxBeginthread(RUNTIME_CLASS(CUIThread));启动线程。UI线程可以直接创建模态对话框,而不用担心消息循环的问题,因为UI线程默认自带消息循环。 MFC非用户界面线程,不能创建模态对话框,但是可以创建非模原创 2016-06-27 00:01:41 · 2002 阅读 · 0 评论 -
Additinal Dependencies和#pragma comment(lib,"*.lib")的分析
网上、一些书上也写道,这两种方式作用一样。其实仔细分析,它们两者还是有非常大的差异的。Additinal Dependencies和#pragma comment(lib,"*.lib")都是针对.lib文件的。而.lib文件其实有两种。一种是与DLL相关的,描述DLL中的函数入口地址等的,在这里两种方法作用一样。一种是静态链接库,就是将静态库工程当前所有目标文件编译成一个二进制文原创 2016-06-16 23:44:25 · 2322 阅读 · 0 评论 -
关于C++内联函数
关于C++内联函数有以下实验:有三段测试代码1、手动展开内联函数。2、非内联函数。3、inline标记的内联函数。(函数只有一行代码,以确保函数被内联)测试三种情况:VS工程在Release版下的有关内联的三个设置选项1、/Ob0 禁用内联展开(默认情况下是打开的)。 2、/Ob1 只展开标记为 inline 或 __inline 的函数,或在类声明内定义的 C++原创 2016-06-20 23:26:26 · 768 阅读 · 0 评论 -
关于静态库中使用全局变量可能导致的问题
同事找我看一个问题,一个访问全局变量不符合预期的问题。因为新工程中静态库动态库非常多,非常不利于分析问题。再因为并不是一个业务逻辑问题,而是一个语言层面的问题,所以我单独抽象出产生问题的环境,简化问题,更容易分析。刚开始,是一个方案,五个工程,能够复现问题。然后继续缩减三个工程,依然能够复现问题。三个工程分别为静态库A,DLL B,EXE C。三者的依赖关系为:B依赖A, C依...原创 2016-06-23 16:17:49 · 4003 阅读 · 0 评论 -
VC++中结构体赋值和memcpy的比较
//Test1typedef struct{int nValue;BYTE nValue2[4];}ST_TEST;int main(){ST_TEST sTest1 = {0};ST_TEST sTest2 = {0};sTest2 = sTest1;memcpy(&sTest2原创 2014-06-02 22:09:40 · 5966 阅读 · 0 评论