自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 VS中MD和MT的区别

MT: mutithread Static,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库MTd:mutithread debug Static ,多线程调试版,连接LIBMITD.lib库MD:mutithread +Dynamic,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dllMDd: mutithread +Dynamic+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为

2022-04-11 11:14:28 1382

原创 C++模板Template

通常有两种形式:函数模板和类模板;一、函数模板通式//template和class是关键字,class可以用typename 关键字代替,在这里typename 和class没区别//<>括号中的参数叫模板形参template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表){ 函数体}//实例template <class T> void swap(T& a, T& b){},

2022-01-24 16:45:20 379

原创 C++11新特性之tuple元组

C++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用 tuple;当函数需要返回多个数据时,可以将这些数据存储在 tuple 中,函数只需返回一个 tuple 对象即可。tuple对象的创建tuple 本质是一个以可变模板参数定义的类模板,它定义在 头文件并位于 std 命名空间中。因此要想使用 tuple 类模板,程序中需

2022-01-24 14:30:53 582

原创 C++11新特性之关键字noexcept

用于指定某个函数不抛出异常为了替代 throw() 而提出的一个新的关键字throwdouble func1 (char param) throw(int);函数 func1 只能抛出 int 类型的异常。如果抛出其他类型的异常,try 将无法捕获,并直接调用std::unexpected。如果函数会抛出多种类型的异常,那么可以用逗号隔开,double func2 (char param) throw(int, char, exception);如果函数不会抛出任何异常,那么只.

2022-01-24 14:25:19 555

原创 C++11新特性之自动类型推导

一、auto在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的。auto 表示变量是自动存储的,这也是编译器的默认规则,所以写不写都一样,一般我们也不写,这使得 auto 关键字的存在变得非常鸡肋。C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样我们就不用手动指明变量的数据类型了。语法如下:auto name = value;name

2022-01-24 14:18:32 180

原创 C++11新特性之字符串原始字面量

格式R"XXX(原始字符串)XXX"括号两边的字符串可以省略注意括号外面的XXX字符串只是起到描述的作用,相当于备注,输出时会被过滤掉,但是必须相同含义直接表示字符串的实际意义,不需要额外对字符串做转义或连接操作实例...

2022-01-24 14:03:21 189

原创 C++ _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)

_WIN32_WINNT:windows版本定义宏,定义了windows的版本Windows XP _WIN32_WINNT>=0x0501Windows 2000 _WIN32_WINNT>=0x0500Windows NT 4.0 _WIN32_...

2022-01-14 17:48:55 2135

原创 Error LNK2005 DllMain already defined in dllmain.obj

问题描述:在创建Win32动态库时,使用了MFC库。原因分析:MFC库中存在DllMain,与现有的DllMain重复解决方案:1.删除现有的DllMain函数2.在工程设置里面,把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL中的_USRDLL,删除,就可以正确编译了。...

2022-01-14 16:22:33 752

原创 MFC CSocket

头文件afxsock.hAfxSocketInit() 函数必须在使用socket之前实现继承关系class CSocket : public CAsyncSocketclass CAsyncSocket : public CObject客户端构造一个CSocket对象。 使用该对象调用Create函数创建底层SOCKET句柄,因为客户端不需要绑定任何端口和地址,所以用默认参数即可 调用Connect函数将套接字对象连接到服务器套接字,指定服务器地址和端口号流程:so.

2022-01-12 16:28:00 1464

原创 C++ REST SDK(Casablanca)

简介微软开发了一个开源跨平台的http库--C++ REST SDK,又名卡萨布兰卡Casablanca。由于REST API的请求支持application/x-www-form-urlencoded、application/json、application/octet-stream等多种编码方式,REST API的返回值都是json形式,很方便返回对象。Casablanca采用c++11开发,集成了PPL和asio,支持异步数据流和web socket.头文件#include <cp

2022-01-11 11:12:28 2808 1

原创 VS Release版本调试(C++)

VS下Release版软件调试,只需要更改以下参数即可

2022-01-10 10:52:11 258

原创 架构设计原则

一、单一职责原则(SRP,Single Resposlillty Principle)就一个类而言,应该仅有一个引起它变化的原因。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。实例://违反SRP原则的代码//modem接口明显有两个职责:连接管理和数据通信class modem{ public void dial(string pno); public void hangup(); public void

2022-01-04 19:14:32 415

转载 C++全局变量执行顺序(#pragma init_seg)

在C++中的全局变量的构造总是优先于Main之前(应该说程序的执行体)1)对于同一个文件(CPP)来说:全局变量的构造顺序按照全局变量的声明来构造。//同一个cpp中C_C g_C;C_A g_A;C_B g_B;构造函数的执行顺序为:C_C(), C_A(), C_B(), 不管是在什么编译器上都是按照这样的顺序执行的,在C++标准中,处于同一编译单元(cpp)的全局对象按其声明次序初始化并倒序析构2)对于不同文件来说:全局变量的构造顺序是不确定的。//C.cppC

2021-12-30 11:03:01 1482

原创 BSTR,_bstr_t ,CComBSTR

BSTRBSTR(Basic string or binary string)是COM 、Automatic、Interop使用的string数据类型。在从脚本访问的所有接口中使用BSTR。BSTR被定义为OLECHAR*类型,查看OLECHAR类型的声明,可以发现它其实是一个wchar_t类型,也就是说一个BSTR字符串其实是一个UNICODE字符串。COM 是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。· ...

2021-12-29 15:30:12 1373

原创 组件COM相关知识了解

idl与odl的区别.odl和.idl在com中的功能相同.前者是ActiveX中的 后者是ATL中.odl ---对象定义语言idl ---接口定义语言idl包含完整的odl 语法其实是一个功能就是在写法上有些不同ATL和MFCATL和MFC代表了两种不同的框架,分别面向不同类型的基于Windows的开发ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码;MFC代表了创建独立的Windows应用的一种简单、一致的方法。这两种框架都可以用来

2021-12-29 14:46:33 171

原创 三坐标测量机(CMM)测头初步了解

测头主要分为接触式测头和非接触式测头接触式测头需要和被测表面发生实体接触的探测系统。又分为点触发测头和接触式扫描测头。点触发测头使用居多,点触发测头,又有手动(带刻度,可重复定位和直角测头)半自动,全自动,五轴测头几种,价格也差距很大。接触式扫描测头,主要是用于需大量采点的检测。是指测头一直贴附在工件表面扫描测量。非接触式测头不需要和被测表面发生实体接触的探测系统非接触式测头主要指激光和影像测头,也可跟接触式测头一同配置,成为复合式三坐标;激光测头,主要用于实现较软材料或

2021-12-29 11:21:55 1457

原创 SafeArray

1.作用SafeArray是VB中的数组存储方式。通过SafeArray,可以在VC++和VB间相互调用在ADO编程中经常使用。主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的.

2021-12-28 13:35:57 625

原创 VARIANT和CComVariant

VARIANT1.定义VARIANT,变体数据类型,在文件OAIDL.IDL中定义VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。简单来说VARIANT主要由一个变量类型vt(枚举值)和一个联合体(变量内容)组成。struct tagVARIANT { union { struct __tagVA

2021-12-28 11:41:22 713

原创 如何判断exe和dll文件是debug还是release编译生成的

用Dependency Walker工具查看:Debug模式的dll和exe,个别系统文件名后面多一个字母D;release模式下则没有D。如:VCRUNTIME.DLL,MFC120D.DLL,MSVCR120D.DLL

2021-12-20 14:42:06 1910

原创 修改MFC的图标

修改应用程序exe的图标和标题栏图标1.将ICO文件拷贝到项目根目录资源文件夹下(res)2.然后在资源视图右击icon文件夹,添加资源->导入->选择刚才的ico文件,即可自动生成资源ID,默认为IDI_ICON13.然后将主窗口代码中LoadIcon函数的参数更换成自己设置的ico文件的ID,点击运行即可完成图标的更换。注意:如果此时应用程序显示的还是原图标,此为WINDOWS系统图标缓存未清除或者重建造成的,在相同路径下相同名字和格式...

2021-12-14 11:35:55 1206

原创 VS指定应用程序输出路径及名称

项目->Properties->Config->Linker->General->OutputFile${ProjectName}表示默认名称

2021-12-14 11:06:04 565

原创 C++ DPI

定义英文全称为Dots per inch,每英寸点数,监视器没有点,但有像素,在显示器上就是每英寸的像素个数。Window上一般默认是96 dpi 作为100% 的缩放比率, 但是要注意的是该值未必是真正的显示器物理值, 只是Windows里我们的一个参考标准。一般来说,缩放比例的步进值是25%,对应DPI的步进值为24,当然用户也可以定义任意缩放值。缩放比例和DPI的关系:100% - 96 DPI125% - 120 DPI150% - 144 DPI175% - 168

2021-12-13 11:39:48 2800

原创 windows屏幕分辨率获取方式

方法一:MonitorFromWindow// 使用桌面的句柄.HWND hWnd = ::GetDesktopWindow();// 获取窗口当前显示的监视器HMONITOR hMonitor = ::MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);// 获取监视器逻辑宽度与高度MONITORINFOEX miex;miex.cbSize = sizeof(miex);GetMonitorInfo(hMonitor, &mie

2021-12-13 11:29:23 2472

原创 VS调试器-Watch/Autos/Locals/Immediate

一.位置二.功能Watch监视窗口当处于调试模式中断下,我们可以通过Watch窗口快速查看我们想观察的变量、表达式的值一共有4个窗口,但大度数情况使用一个窗口就够了。4个独特的窗口意味着可以把不同类型的变量分别显示在不同窗口。如果开发人员处理的是涉及多个类的复杂问题,这种显示方法就会非常有用。Watch窗口可以随时任意添加变量、表达式,也可以删除不观察的变量、表达式。Autos自动窗口当处于调试模式中断下,Autos窗口将自动显示变量。窗口里的变量是调..

2021-12-09 12:22:08 1204

原创 C++中hpp文件浅析

定义hpp,是Header Plus Plus的简写,与.h类似,.hpp是C++程序头文件格式,其实质就是将.cpp的实现代码混入.h头文件当中.定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。实现代码将直接编译到调用者的obj文件中,不再生成单独的obj.优点1、将大幅度减少调用 project中的cpp文件数与编译次数.2、不用再发布烦人的lib与dll3、非常适合用来编写公用的开源库。

2021-12-09 11:02:17 1431

转载 C++中NULL和nullptr的区别

在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。一、C程序中的NULL在C语言中,NULL通常被定义为:#define NULL ((void *)0)所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,

2021-12-08 16:44:05 109

原创 MFC中SetFont函数功能无效分析

问题:在OnInitDialog()中,设置控件字体,代码如下CFont font;font.CreatePointFont(150,_T("Microsoft Sans Serif"));m_Static.SetFont(&font);但是不管更改成何种字体,在界面上都无明显变化。解决方案:将font对象改成全局变量,字体设置立即生效...

2021-12-07 14:22:56 859

原创 MFC分隔线

MFC界面没有分隔线控件,验证了多种方案,如下方案效果比较好1.使用控件Picture Control,并将控制拖放成如下状态2.修改控件属性SunKen=true3.实际效果如下

2021-12-03 17:59:35 321

原创 MFC中Debug Assertion Failed原因查找方法

问题断言错误如下图分析报错对话框中给出了一个目录,是在F盘,但是查找之后会发现电脑里可能根本没有这个目录。最后发现可以在VS的安装目录下找到这个文件:\atlmfc\src\mfc 这部分路径是固定的。且错误提示345行出现问题方法1.搜索VS安装目录,找到文件夹\atlmfc\src\mfc2.打开文件winocc.cpp3.找到345行:ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));4.把这行代码.

2021-11-22 14:54:29 2679 1

原创 VS调试技巧--Attach to Process

使用Visual Studio进行程序调试,我们通常有这样的烦恼:按F5开始调试,程序需要等好长时间才启动(如:加载文件或资源),再次调试又要不得不按F5并耗时等待。对此,我向大家推荐VS自带的Attach to Process功能,把源代码和程序Attach后进行调试,并可设置断点分步调试,这样既省去了开启关闭进程的麻烦,又节省了很多等待的时间,从而提高编程效率!1.在VS的工具栏中从Tool菜单栏中选中Attach to process2.弹出的Attach to process 对话框中,

2021-11-16 14:53:14 2063 1

原创 线程局部静态变量TLS(c++)

线程局部静态变量(static memory local to a thread)----在一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量。区别于静态变量进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量。在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程的数据交换变得非常快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG。对TLS进

2021-11-11 15:13:12 1826

原创 GDI&GDI+

差异:1.使用GDI时,经常需要将PEN、BRUSH等GDI对象选入DC,并需要保存旧的GDI对象,然后进行一些绘图操作。此时调用的绘图函数都是使用这些新选入的PEN、BRUSH,绘图完成之后再把旧的GDI对象重新选回DC,这称之为“状态模式”。而GDI+不是这样,GDI+只是将PEN、BRUSH等对象作为参数传递给绘图函数,它们只影响这一次的绘制,下次再调用绘图函数,可以将新的PEN、BRUSH传入给绘图函数,这称为“无状态模式”。2.DC是GDI的核心,Graphics对象是GDI+的核心

2021-11-09 10:31:18 433

原创 MFC CString

大小写,顺序,连接,比较,提取,查找,替换,删除,格式化,分割1.构造函数:CString(const CString& stringSrc);将一个已经存在的CString对象stringSrc的内容拷贝到该CString对象,例如:CStringstr1(_T("www.jizhuomi.com"));//将常量字符串拷贝到str1CStringstr2(str1);//将str1的内容拷贝到str2CString(LPCTSTR...

2021-11-09 10:11:52 891

原创 MFC注册表CRegKey

注册表是由windows维护的一个小数据库.里面也会保存windows本身的很多配置信息.有时程序中要存些设置信息,一个方法就是创建一些普通的txt或xml文件,然后保存进去就行了.另一办法就是保存到注册表里最顶端的5个根键:1.)HKEY_CLASSES_ROOT定义了系统中所有文件类型标志和基本操作标志.2.)HKEY_CURRENT_USER当前用户的配置信息,包括环境变量、桌面设置、网络连接,软件运行信息等3.)HKEY_LOCAL_MACHINE本机相关的系统信息,

2021-11-09 10:10:32 907

原创 线程同步Thread Synchronous(C++)

同步(synchronous):当程序1调用程序2时,程序1 停下不动,直到程序2完成回到程序1来,程序1才继续下去;异步(asynchronous):如果程序1调用程序2后,径自继续自己的下一个动作,那么两者之间就是asynchronous;一.Win32(1)事件(Event)#include<windows.h>使用CreateEvent创建一个事件HANDLE WINAPI CreateEvent( _In_opt_ LPSECURITY_ATTRIBUTES .

2021-11-09 09:59:04 291

原创 Ribbon界面开发(C++)

一.简介Ribbon:固定式工具栏界面,能够使用户更容易地使用软件的各项常用功能,例如Word 2007中的保存,设置格式,插入图片等常用功能,都可以从Ribbon界面快速地访问到,从而提高用户的生产效率二.项目创建1)利用MFC向导生成单文档应用程序框架三.为Ribbon控件添加消息处理函数...

2021-11-09 09:46:24 1575

原创 线程Thread(C++)

总结有关创建线程的问题有四种方法:1.C语言函数,调用_beginthread();2.API函数,调用CreateThread();3.MFC函数,调用AfxBeginThread();4.C++11 的 std::thread推荐使用MFC函数AfxBeginThread();1._beginthreadunsigned long _beginthread( void(_cdecl *start_address)(void *), //声明为void (*start_.

2021-11-05 17:47:26 884

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除