![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
windows
文章平均质量分 73
小飞侠hello
这个作者很懒,什么都没留下…
展开
-
vs、c++环境下开发使用com组件
COM组件是一组接口的集合,由Win32动态链接库(DLL)或可执行文件(EXE)的形式发布的可执行二进制代码组成。com是独立于语言的组件体系结构,可以用C++、Java和VB等任意一种语言编写com对象。COM组件的优点有:通过接口对功能分类;功能扩充,只需添加接口就行;可轻松实现进程间调用、分布式调用;具有封装、继承、多态的面向对象特征。COM是规范,以该规范实现的DLL可视为COM组件。原创 2023-07-06 11:15:19 · 4753 阅读 · 0 评论 -
windows 内核对象事件量 CEvent
Event是windows操作系统的一种内核对象,它可以用于进程间同步和线程间同步。原创 2023-01-05 14:41:21 · 459 阅读 · 0 评论 -
静态链接和动态链接
静态链接是在编译链接时直接将需要的执行代码拷贝到调用处;优点在于程序在发布时不需要依赖库,可以独立执行。缺点在于程序的体积会相对较大,而且如果静态库更新之后,所有可执行文件需要重新链接;动态链接是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定代码时,在共享执行内存中寻找已经加载的动态库可执行代码,实现运行时链接;优点在于多个程序可以共享同一个动态库,节省资源;缺点在原创 2022-03-04 15:56:51 · 167 阅读 · 0 评论 -
Windows平台release版本内存泄漏检查办法
release版本内存泄漏的使用工具是Leakdiag下载安装下载地址:链接:https://pan.baidu.com/s/1m_eJI3Iy-CNWLghpj5cyvw提取码:qiteLeakdiag下载之后按照默认设置安装,否则好像是会出问题的。默认安装是直接装在C盘下。Logs文件夹里边存储的就是记录的日志,我们则是通过启动leakdiag应用程序进行检测。LeakDiag支持5种不同的分配:1) Virtual Memory Allocator 虚拟分配。 这种分.原创 2021-12-17 17:26:48 · 1887 阅读 · 1 评论 -
C运行时库(CRT)
什么是C运行时库C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。C运行时库除了给我们提供必要的库函数调用(如memcpy、printf、malloc等)之外,它提供的另一个最重要的功能是为应用程序添加启动函数。C运行时库启动函数的主原创 2021-12-16 14:53:36 · 2063 阅读 · 0 评论 -
windbg远程调试方法
远程调试是需要又在不同位置上的调试器。执行真正调试称为调试服务器,另外一个,被称为调试客户端。调试客户端,控制着一个与远程调试器相应的是会话。有2种方式:直接使用windbg进行远程连接,使用cmd命令行。pdb文件一定放置在服务器上面,在客户端的windbg里设置的符号文件路径也一定设置服务器的路径,否则在客户端的调试器中会出现无法打开路径的警告。使用Windbg进行远程调试服务端1.在服务端当正常普通的情况下,使用Windbg运行可执行exe,像正常调试检测一样,可以执行到dmp文件原创 2021-12-14 20:03:11 · 3310 阅读 · 0 评论 -
函数调用约定
函数的调用约定不仅决定着函数参数压入栈中的先后顺序,还决定了应该由谁来释放给被调函数传递的参数所占用的栈空间。常见的约定:__stdcall,__cdecl,__fastcall,__thiscall,__nakedcall,__pascal,__vectorcall参数传递顺序1.从右到左依次入栈:__stdcall,__cdecl,__thiscall,__fastcall2.从左到右依次入栈:__pascal调用堆栈清理1.调用者清除栈。2.被调用函数返回后清除栈。原创 2021-12-13 15:26:41 · 1181 阅读 · 1 评论 -
c++ 文件操作方式
1.使用标准C运行库函数,包括fopen、fclose、fseek、fwrite、fread、fprintf等.需要FILE *fopen(const char *filename, const char *mode);ilename-- 这是 C 字符串,包含了要打开的文件名称。 mode-- 这是 C 字符串,包含了文件访问模式 "r" 打开一个用于读取的文件。该文件必须存在。 "w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除..原创 2021-12-06 17:01:33 · 2844 阅读 · 0 评论 -
printf 和sprintf
(1)printf是把格式化字符串输出到标准输出(一般是屏幕).printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h。函数原型 int printf ( const char * format, ... );调用格式:printf()函数的调用格式为:printf("格式化字符串",输出表列)。格式化字符串包含三种对象,分别为:(1)字符串常量;(2)格式控制字符串;(...原创 2021-12-06 14:29:00 · 1086 阅读 · 0 评论 -
vs的运行库 MT MTd MD MDd区别
MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dllMDd:MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll修改地方是:“项目 -> C/C++ ->代码.原创 2021-12-06 09:54:21 · 4097 阅读 · 0 评论 -
c++ 打印日志信息
__TIME__ :文件运行的时间 (显示编译的时间)__LINE__ :所在行数__FILE__:文件的名字如#include <stdio.h>int main(in原创 2021-12-03 17:04:39 · 2544 阅读 · 0 评论 -
使用windbg 检查c++程序死锁
上一篇文章是使用lockcop软件检测死锁的。参考见:使用lockcop软件检测c++死锁_baidu_16370559的博客-CSDN博客现在使用windbg。可运行的程序和代码还是一样的。1.配置symbols因为我使用的windbg 版本是6.12 。提示Unable to resolve ntdll!RtlCriticalSectionList因为在新版本的windbg中可能部分指令不支持。如果有如下提示NTSDEXTS: Unable to resolve ntdll!Rt原创 2021-11-21 16:42:28 · 1216 阅读 · 0 评论 -
使用lockcop软件检测c++死锁
背景:C++多线程开发中,容易出现死锁导致程序挂起的现象。工具:lockcop.exe,下载见:链接:https://pan.baidu.com/s/1UCZaspmHp9I0ekVRbPO5_w提取码:hv48测试过程1.使用VS2017编写一段代码,见下面,调试运行起来,程序名为memeroy.exe,CRITICAL_SECTION cs1;CRITICAL_SECTION cs2;CRITICAL_SECTION csprint;//初始化关键代码段void.原创 2021-11-09 10:40:44 · 1777 阅读 · 0 评论 -
利用windbg分析程序崩溃生成的dmp文件
Windbg是一款功能十分强大的调试工具,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。基本步骤:●STEP 1:打开Windbg,在file中选择open crash Dump来打开所需要调试的Dump文件。●STEP 2:在file菜单中分别设置好Symbol file path 和 Source file path。其中Symbol file path是程序编译时所生成的pdb文件,具体到某一个.pdb文件,如:...原创 2021-11-04 13:54:01 · 4066 阅读 · 0 评论 -
windows系统利用vs 分析DMP文件、pdb文件定位异常崩溃
exe文件、dmp文件和pdb文件必须保持一致!exe文件和pdb文件同时生成,dmp文件是由当前exe生成的。设置生成 pdb选择 项目 -> 工程名+属性,如下图所示。 之后选择 配置属性 -> 连接器 -> 调试,如下图所示。上图中,“生成调试信息”为pdb文件生成与否的使能开关,“生成程序数据库文件”为该pdb文件的名字,默认即可。DUMP文件生成dump文件的办法1.手动设置生成。在代码调试过程中,知道会出现bug的情况下,手动点击工具栏的调试..原创 2021-11-02 16:25:00 · 9246 阅读 · 1 评论 -
windows WinHttp
WinInet和WinHttp是windows平台下提供了两套独立的网络库,按照微软官方的说法, WinInet的优势在于client-端的应用,而WinHttp更适用于server-端编程。从名称上我们可以看出WinHttp在Http协议应用方面要比WinInet更加专业,WinInet支持的协议包括Gopher\HTTP\HTTPS\FTP较为杂乱,而WinHttp库专门是为HTTP\HTTPS服务的。在一个Session之上可以存在多个Connection对象,每个Connection对应于一个目原创 2021-11-01 18:01:08 · 1650 阅读 · 1 评论 -
wininet InternetOpen\InternetOpenUrl\InternetReadFile 等
Microsoft 已经介绍了Microsoft Win32网络函数来协助开发者把网络变成他们的应用程序的整体部分。这些新的功能简化了使用FTP(文件传输协议)、和HTTP(超文本传输协议)访问网络。使用Win32网络函数的开发者不需要对TCP/IP或Windows 配件。1.InternetOpenInternetOpen初始化WININET.DLL。它在其他的Win32网络函数之前被调用。HINTERNET hNet = ::InternetOpen( "MSDN Sur...原创 2021-10-25 15:36:06 · 1658 阅读 · 0 评论 -
windows 下 c++ 各字符(char、wchar_t、string、cstring)的转换
c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串.好像在c++11两者没有区别了std::string、std::wstring的关系①:std::string内部是char单字节字符②:std::wstring内部是WCHAR宽字符,即wchar_t在MFC的工程中我们可以设置工程的编码属性:①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符 即wchar_t②:对于多字节的编码属性CString.原创 2021-10-14 16:28:35 · 2206 阅读 · 0 评论 -
DebugView 的使用
1. 捕捉Release模式的Win32程序输出的调试信息,请选中“Capture Global Win32”选项2. 只有调用了WinDebug中的方法输出的Debug打印信息才能被Debugview捕获。3. 在MFC中使用TRACE,只是debug调试状态下,vs的输出窗口上看到信息。如果是release版本就无法看到了,所以需要适用DebugView 这个软件。4.debugview 可以捕获程序中由TRACE(debug版本)和OutputDebugString输出的信息。支...原创 2021-10-11 17:39:43 · 341 阅读 · 0 评论 -
c++ 前置声明
#pragma onceclass bar;class foo{public: Bar getBar();private Bar* _bar;};即:在.h文件中用class 声明代替include头文件前置声明只能作为指针或引用,不能定义类的对象,自然也就不能调用对象中的方法了。前置声明要求:1.其声明的类是文件所声明的类的数据成员时,是指针成员或引用成员(而不是对象成员);2.其声明的类是文件所声明的类的成员函数的参数或返回值时,该函数在文件中不存在定义。 ...原创 2021-09-29 14:47:19 · 4485 阅读 · 0 评论 -
c++ inline 函数及变量
1.引入inline关键字的原因为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。2.使用inline的代价内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于.原创 2021-09-29 10:44:35 · 617 阅读 · 0 评论 -
Windows平台下c++ 内存泄漏检查的办法(如VLD)
1.#define CRTDBG_MAP_ALLOC //注意顺序不能乱#include <stdlib.h> #include <crtdbg.h>int main(void){ int* leak = new int[10]; _CrtDumpMemoryLeaks();//注意必须放在程序的结尾处 return 0;}2.#include <crtdbg.h>int main(void){#ifdef...原创 2021-09-28 15:13:59 · 3310 阅读 · 0 评论 -
vs 配置 .pdb
配置生成位置:当前工程右键属性 -> 配置属性 -> 链接器 -> 调试右边 生成调试信息 选择是生成程序数据库文件 选择刚才pdb目录+生成pdb文件名配置加载pdb位置:vs菜单栏 工具->选项->调试->符号然后在右边添加pdb目录路径就可以了...原创 2021-07-01 15:56:15 · 1987 阅读 · 0 评论 -
手把手分析 mfc 程序创建 代码执行流程
程序流程1.先全局变量theapp;2.AfxWinMain,包括执行InitApplication、InitInstance(一般会重写)、Run3.在InitInstance 会create 窗口,通过LoadFrame(多文档,只创建CMDIFrameWnd,至于cdoc、CMDIChildWnd、cview是执行ProcessShellCommand创建的)或者 ProcessShellCommand(单文档,同时创建cdoc、cframe、cview)。‘’其实多文档也执行Proc原创 2021-06-21 16:29:56 · 662 阅读 · 0 评论 -
com 的 IUnknown 接口的了解
1.一切类的继承都是源于IUnknown 和CUnknown 。typedef CComPtr< IUnknown > IUnknownPtr;typedef CComPtr< CUnknown > CUnknownPtr;IUnknown 是com 的接口C++实现COM技术规范是通过一个名为IUnKnown的抽象类,即包含纯虚函数的类,这样的类即称为接口。该类只有三个函数:QueryInterface、AddRef、Release,且都是纯虚函数,一个可执行文件的类只要原创 2021-05-31 15:18:50 · 832 阅读 · 0 评论 -
拆分窗口
MDI 3层窗口结构1. mdi frame 窗口:以wm_create 消息的方式建立client 窗口,2. mdi client窗口:3.mdi child窗口把拆分窗口csplitterwnd当成 mdi client。具体操作:让新增一个类,派生自cmdichildwnd,并让它拥有一个csplitterwnd对象,然后改写该类的oncreateclient虚函数。在该虚函数中调用csplitterwnd::create产生拆分窗口。...原创 2021-04-12 19:55:52 · 97 阅读 · 0 评论 -
设备坐标和逻辑坐标
设备坐标(DeviceCoordinate)又称为物理坐标(PhysicalCoordinate),是指输出设备上的坐标。又称视口坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标(LogicalCoordinate)是系统用作记录的坐标。又称窗口坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为...原创 2021-04-12 09:33:52 · 953 阅读 · 0 评论 -
mfc 对话框
对话框数据交换和校验交换:DDX(dialog data exchange) DDX_control、ddx_text校验:DDV(dialog data validation)另外还有DDP(ocx 中用到的)dodataexchange 由一组组ddx,ddv组成。先ddx,再ddv.做出modal(模态)对话框,调用DoModal函数即可。...原创 2021-04-09 14:42:34 · 90 阅读 · 0 评论 -
c++ 函数指针和指针函数
函数指针的声明方法为:返回值类型 ( *指针变量名) ([形参列表]);注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int func(int x); /* 声明一个函数 */int (*f) (int x); /* 声明一个函数指针 */f=func; /* 将func函数的首地址赋给指针f */.原创 2021-03-31 15:36:17 · 476 阅读 · 0 评论 -
HOOK(钩子,挂钩)
HOOK(钩子,挂钩)是一种实现Windows平台下类似于中断的机制。HOOK机制允许应用程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能。钩子按使用范围分,可分为线程钩子和系统钩子,其中,系统钩子具有相当大的功能,几乎可以实现对所有Windows消息的拦截、处理和监控。这项技术涉及到两个重要的API,一个是SetWindowsHookEx,安装钩子;另一个是U原创 2021-03-30 13:42:42 · 1047 阅读 · 0 评论 -
cdc绘图
设备上下文 :m_hDC或者GetSafeHdc函数CDC对象: CDC对象或指针 或FromHandle关联:Attach分离:Detach一、客户区大小和DC在绘图前,必须先得到客户区大小和设备上下文DC。客户区大小(2种办法)1)在消息响应函数OnSize中获得利用属性窗口的信息页,在视图类中添加WM_SIZE消息的响应函数OnSize。该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。其输入参数中的cx和cy就是客户区大小的宽和高。v...原创 2021-03-09 15:23:54 · 762 阅读 · 0 评论 -
CPaintDC 、CWindowDC、 CClientDC、cMemDC、 CDC
CPaintDC 、CWindowDC、 CClientDC、 CDC关系图:一句话概括:CPaintDC 无效区dc,相当于BeginPaint, EndPaintCClientDC 客户区dc,相当于GetDC, ReleaseDCCWindowDC 整窗口dc, 相当于GetWindowDC, ReleaseDCCDC 任何dc, ...原创 2021-03-08 16:49:07 · 649 阅读 · 0 评论 -
CmemDC类 的使用方法
CmemDC类 的使用方法CMemDC其实就是对内存DC的创建与删除进行一个包装。1、在CMemDC的构造函数中创建内存DC;2、用户可以在CMemDC dc中进行图像的绘制;3、在CMemDC的析构函数中进行内存DC到目标DC的拷贝,并做相应的GDI对象清理工作。使用这样的类可以让你的代码有很大程度的简洁。举个例子:如果我们不使用CMemDC,一般我们会写下面的一段的代码,CView::OnDraw(CDC*pDC){CRectrcClient;GetClientRe...原创 2021-03-08 16:43:36 · 680 阅读 · 0 评论 -
句柄即GetSafeHwnd的作用
GetSafeHwnd()和GetSafeHandle()的主要区别:1.使用者不同:(1)窗体使用:GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的对HWND指向的窗体进行所需的操作了;(2)GDI对象使用:GetSafeHandle(),用于获取GDI对象的句柄。注意:在使用指针时强烈建议这么做:// pSomeWnd为一个窗体的指针if ( NULL != pSomeWnd && NULL != pSo..原创 2021-03-08 11:07:29 · 1171 阅读 · 0 评论 -
c++ 使用gdiplus
在要使用的工程中,增加如下代码#include< comdef.h > // 初始化一下com口// 在GDI+中,需要定义一个ULONG_PTR。#ifndefULONG_PTR#define ULONG_PTRunsignedlong*#endif// 通过typedef定义的。与上面的宏定义的作用效果是一样的。这两个,任意一种方法都可以。其他的能达到同样效果的方法也一样。#if defined(_WIN64)typedefuns...原创 2021-03-05 10:27:56 · 2557 阅读 · 2 评论 -
在虚函数 声明中写override的作用
C++保留字overrideoverride 仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。使用 override 有助于防止代码中出现意外的继承行为。以下示例演示在未使用override 的情况下,可能不打算使用派生类的成员函数行为。编译器不会发出此代码的任何错误。class BaseClass{ virtual void funcA(); virtual void funcB() const; virtual void funcC(...原创 2021-03-04 15:34:48 · 1303 阅读 · 1 评论 -
深入浅出mfc 运行时类型识别(RTTI 、DECLARE_DYNAMIC)、动态创建( DCLARE_DYNCREATE)、永久保存(DECLARE_SERIAL)
只有用DECLARE_DYNAMIC,DECLARE_DYNCREATE或DECLARE_SERIAL定义的CObject的派生类才能返回CRuntimeClass结构指针。4. 程序的模块状态中有所有的RuntimeClass的列表,因此,查找对应的程序支持的RuntimeClass(对比ClassName),获得对应的RuntimeClass;//初始化一个名为"_init_##class_name"的AFX_CLASSINIT静态结构,主要作用是给指定的class_name的。原创 2020-12-11 11:04:31 · 889 阅读 · 0 评论 -
MFC 之序列化 serialize 和CArchive
必须为希望串行化的每个类覆盖Serialize。被覆盖的Serialize首先必须调用基类的Serialize函数。在类的声明中必须使用DECLARE_SERIAL宏,并且在类的执行过程中也必须使用IMPLEMENT_SERIAL宏。使用CArchive::IsLoading或CArchive::IsStoring函数,用于决定是否装载或存储了档案文件。步骤是1.必须在创建一个CArchive对象之前,创建一个CFile对象。2.创建CArchive对象,要把它附加给表示一个打开文.原创 2021-01-13 15:24:22 · 877 阅读 · 0 评论 -
深入浅出MFC 6大关键技术之仿真 mfc程序初始化过程
1.c++规定,全局对象的建构将比程序进入点(即main或者winmain)更早,所以theapp的构造函数将更早于mian或winmain.2.原创 2021-01-12 08:28:12 · 183 阅读 · 0 评论 -
深入浅出MFC - C++ 重要性质
1.this指针成员函数有一个隐藏参数,名为this 指针。this 在编译期间出现。2. A a;基类 B b; 子类 。 A *p = &b; //多态的既可以通用基类的指针调用子类对象的方法 p->Func(); //调用的是B类对象的函数。 如果Func不是虚函数,调用的是A类对象的函数. 说明:在无虚函数的情况下,基类和派生类都定义相同名称的成员函数,那么通过对象指针调用成...原创 2020-12-23 09:57:02 · 142 阅读 · 0 评论