C/C++
文章平均质量分 84
jiangqin115
这个作者很懒,什么都没留下…
展开
-
C++代码静态分析工具-Prefast
1. 什么是PrefastPrefast是一种代码分析工具,它能够帮助你找到编译器不能找到的错误或者缺陷。Prefast首次被微软集成到Visual Studio 2005 Team Suite中去,使用起来非常方便。2.怎么使用Prefast在vs2005 Team Suite中,使用Prefast非常简单。修改你的工程属性,设置Enable Code Analysis For C/C++为Yes.效果:注意到有可能错误的地方以浅灰色显示在编辑器中了。3.Prefast能帮你找到哪些错误1原创 2021-02-09 10:55:53 · 857 阅读 · 0 评论 -
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-02-09 10:28:46 · 405 阅读 · 0 评论 -
为什么父类指针可以指向子类,反之则不行?
为什么父类指针可以指向子类反之则不行?例如:[cpp] view plain copyclass a {public: int aa}; class b:public a {public: int bb; } 从内存的来看如a[plain] view plain copy原创 2017-10-20 10:46:33 · 2199 阅读 · 2 评论 -
把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nod原创 2017-10-12 09:26:56 · 248 阅读 · 0 评论 -
base64
Base64是一种用64个字符来表示任意二进制数据的方法。Base64的加密原理是将3个8位二进制转换为4个6位二进制,不足6位时高位补0 ,以确保其值为64个可能,这就是Base64来源。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制原创 2017-10-28 18:13:38 · 200 阅读 · 0 评论 -
模板类与类模板、函数模板与模板函数等的区别
在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用。下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误。 这几个词是: 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 最终在使用中,我们就可以让它们实至名归,名正言顺。 1.函数指针——指针函数原创 2017-10-10 21:18:03 · 323 阅读 · 0 评论 -
模板类的继承
模板类的继承包括四种:1.(普通类继承模板类)[cpp] view plain copytemplateclass T> class TBase{ T data; …… }; class Derived:public TBaseint>{ …… }; 2.原创 2017-10-10 20:59:48 · 262 阅读 · 0 评论 -
常量指针和指针常量的区别详解
在C/C++中关键字const用来定义一个只读的变量或者对象,有如下优点 (1)便于类型检查,如函数的函数 fun(const int a) a的值不允许变,这样便于保护实参。 (2)功能类似与宏定义,方便参数的修改和调整。如 const int max = 100; (3)节省空间,如果再定义a = max,b=max。。。就不用在为max分配空间了,而用宏定义的话原创 2016-03-08 13:13:47 · 481 阅读 · 0 评论 -
关于msdn中NtQuerySystemInformation函数说明
函数原型typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,IN OUT PVOID转载 2015-12-15 12:30:30 · 3825 阅读 · 0 评论 -
eixt(0),ExitProcess,和TerminateProcess的区别和联系
首先来谈谈一个进程的执行流程。每个应用程序都有个主函数,在WINDOWS下,只支持两种类型的应用程序——CUI(控制台应用程序)和GUI(图形界面应用程序),相应的,其主函数类型不同。来看下这几个入口函数[cpp] view plaincopyprint?int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE,PSTR pszCmdLine, int原创 2015-12-13 11:30:09 · 3473 阅读 · 0 评论 -
C++异常机制的实现方式和开销分析
C++异常机制的实现方式和开销分析白杨http://baiy.cn 在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其转载 2015-12-12 19:52:18 · 434 阅读 · 0 评论 -
使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数
使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数0条评论如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函数只能有一份这样的东东(“代码和信息”),故一个函原创 2015-12-12 19:49:43 · 1983 阅读 · 0 评论 -
Wow64(32位进程)注入DLL到64位进程
http://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/#Wow64环境下32位进程注入64位进程DLL注入向其他进程注入DLL通常的做法是通过调用CreateRemoteThread这个API在目标进程内创建一个远程线程,用这个线程来调用LoadLibraryA或LoadLibraryW(下文统称Load转载 2015-07-04 13:11:31 · 5921 阅读 · 0 评论 -
c++动态联编与静态联编
静态联编说的是在编译时就已经确定好了调用和被调用两者的关系动态联编说的是程序在运行时才确定调用和被调用者的关系.这个主要是虚函数实现的多态性.1.静态联编静态联编是指联编工作在编译阶段完成的,这种联编过程是在程序运行之前完成的,又称为早期联编。要实现静态联编,在编译阶段就必须确定程序中的操作调用(如函数调用)与执行该操作代码间的关系,确定这种关系称为原创 2017-10-23 11:12:33 · 395 阅读 · 0 评论 -
编程之美:让CPU占用率曲线听你指挥
题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:1. CPU的占用率固定在50%,为一条直线;2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);3. CPU的占用率状态是一个正弦曲线。首先什么是原创 2017-11-03 09:38:05 · 2770 阅读 · 2 评论 -
VS2010创建并使用DLL
一、为什么需要dll代码复用是提高软件开发 效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架, 如ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点 比较多,总结起来有4点。暴露了源代码;容易与程序员的“普通”代码...原创 2018-06-23 12:40:56 · 5498 阅读 · 0 评论 -
C++ dll的隐式与显式调用
应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0(或者更先进的版本)在VC\bin目录下提供了一个名为Dumpbin.exe的小程序(使用方法见VS自带工具:dumpbin的使用),用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录...原创 2018-06-23 12:40:17 · 1810 阅读 · 0 评论 -
使用ExitProcess()结束本进程,TerminateProcess()结束进程
进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数的原型为:void ExitProcess(UINT uExi原创 2015-06-26 16:48:27 · 5019 阅读 · 0 评论 -
GetCommandLine 分析
程序的 abc.exe三个参数 1 2 31. 通过CreateProcess()调用abc.exe的情况BOOL bRet = CreateProcess(sCmd,sParam,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);(1)如果sCmd = "D:\test\abc.exe", sParam原创 2015-06-27 14:06:09 · 17794 阅读 · 0 评论 -
C++派生类与基类的转换规则
基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,具体表现在以下几个方面,需要的朋友可以参考下只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能。基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替。具体表现在以下几个方面: 派生类对象可以向基类对象赋值原创 2015-04-01 18:18:57 · 707 阅读 · 0 评论 -
“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
问题描述如下:有 三个源文件,A.h、B.cpp、C.cpp。A.h是头文件,其中声明了三个变量a1、a2、 a3。B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件 A.h。在编译时,编译能够通过,但链接时出了问题,出现”error LNK1169: 找到一个或多个多重定义的符号“的错误。经过分析,确定了这是由于两原创 2015-03-23 21:04:43 · 4452 阅读 · 0 评论 -
异或“∧”运算的作用
异或运算法则:相同为0,不同为1异或运算符∧也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,结果为023(八进制数)。“异或”的意思是判断两个相应的位值是否为“异”,为“异”(值不同)就取真(1),否则为(0)。 下面举例说明∧运原创 2015-03-06 16:14:45 · 5593 阅读 · 0 评论 -
获取IP/MAC地址方法
函数声明://得到本机MAC地址BOOL GetLocalMacAddr(char *szMac, int nMacLen);//根据IP获取MAC地址(可获取远程主机MAC地址)BOOL GetMacAddrByIp(const char *szIPAddr, char *szMacAddr, int nMacLen);//获取网卡详细信息#inc原创 2014-10-24 09:03:44 · 1008 阅读 · 0 评论 -
C++ vector反向迭代器的使用
反向迭代器反向迭代器其实没什么特殊的,他只是在遍历的方向上和普通迭代器不通而已:每一个容器里面都有Iterator(迭代器),可以从容器的begin位置到end-1位置,通过++来遍历。同样也有个反向迭代器reverse_iterator,从rbegin(=end)到rend(=begin-1)反向遍历,仍然通过++来遍历. C++ primer (中文版第四原创 2015-02-10 09:58:56 · 16916 阅读 · 1 评论 -
C++ sort()及qsort()的用法总结
想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~所以自己总结了一下,首先看sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy原创 2015-02-10 17:55:37 · 800 阅读 · 1 评论 -
如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在原创 2015-01-13 21:13:08 · 25260 阅读 · 3 评论 -
C++ UTF8编码转换 CChineseCode
一 预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之原创 2015-01-14 17:33:16 · 1285 阅读 · 0 评论 -
inno setup 打包工具介绍
使 用 笔 记1、Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞争力可能已经超过一些商业的安装程序制作软件。关键功能:★ 支持现在所有正在使用的 32 位 Windows 版本: Windows 95,98,2000,Server 2003,原创 2014-10-19 13:32:48 · 3704 阅读 · 0 评论 -
typedef 用法小结
这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等地方都大量的用到.但是有些地方还不是很清楚,今天下午,就想好好研究一下.上网搜了一下,有不少资料.归纳一下:来源一:Using typedef to Curb Miscreant CodeTypedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来原创 2014-10-15 13:54:58 · 532 阅读 · 0 评论 -
CreateProcess的用法
第一、第二个参数的用法: 例子:使用ie打开指定的网页。注意第二个参数是 可执行文件+命令行参数[cpp] view plaincopy#include "stdafx.h" #include #include int main(int argc, char* argv[])转载 2014-10-25 09:21:47 · 1205 阅读 · 0 评论 -
递归删除目录下.svn文件
在linux下完svn的都碰到过一个这样的问题,怎么一次性删除该目录以及子目录下下所有.svn文件呢?递归删除!介绍两种方法1.find和exec结合 find . -name "*.svn" -print -exec rm -rf {} \; 做一个简单说明 -exec之后的rm -rf是命令以及参数,{}就是find的命令找到的结果集,\;是必须原创 2014-10-26 21:13:33 · 557 阅读 · 0 评论 -
CloseHandle(),TerminateThread(),ExitThread()的区别
线程的handle用处:线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问。该内存块是一种数据结构,它的成员负责维护对象的各种信息(eg: 安全性描述,引用计数等)。CloseHandle()在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,Cl原创 2015-04-23 15:31:39 · 647 阅读 · 0 评论 -
C++多线程编程简单实例
C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwStackSize,原创 2015-04-23 15:33:48 · 648 阅读 · 0 评论 -
ShellExecuteEx提升子进程权限
首先说下ShellExecuteEx是如何提升权限的,ShellExecuteEx函数只有一个参数,就是SHELLEXECUTEINFO结构体,不过是指针类型的,这无所谓,关键是这个结构体中有一个参数lpVerb,它的作用就是指定如何操作文件lpFile,提升权限就是设置lpVerb为“runas”。将lpVerb设定为”open”或NULL的时候,创建的子进程继承了主进程的权限,当主进程原创 2015-06-27 17:51:37 · 6008 阅读 · 0 评论 -
OpenProcess、GetExitCodeProcess、TerminateProcess
//声明:{返回进程的句柄}OpenProcess( dwDesiredAccess: DWORD; {访问选项} bInheritHandle: BOOL; {能否继承; True 表示能用 CreateProcess 继承句柄创建新进程} dwProcessId: DWORD {指定进程 ID}): THandle; {成功原创 2015-06-26 16:59:05 · 2356 阅读 · 0 评论 -
删除INI文件某个字段或者键值
假设D盘下面有 叫 test.ini文件,内容如下:[section1]name1=value1[section2]neame2=value2 如果我们想删除 name1=value1这一行数据,那么这样就可以了::WritePrivateProfileString("section1","name1",NULL,"D:\\原创 2015-06-19 10:19:13 · 9961 阅读 · 0 评论 -
STL::list
标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。STL中的list就是一双向链表,可高原创 2015-05-27 19:25:58 · 525 阅读 · 0 评论 -
判断操作系统是32位还是64位
1判断操作系统是32位还是64位//方法I:BOOL IsWow64(){ //函数IsWow64Process()用于确定指定进程是否运行在64位操作系统的32环境(Wow64)下 //如果该进程是32位进程,运行在64操作系统,该值为true,否则为false,具体如下: //32bit程序跑在32bit系统下,返回0. //32bit程序跑在64bit系统下,是wow64模式原创 2015-05-07 15:48:44 · 1801 阅读 · 0 评论 -
判断应用程序是32位还是64位
VC++检测可执行程序DLL、EXE等是32位还是64位1.首先介绍PE结构 Windows系统下的可执行文件,是基于Microsoft设计的一种新的文件结构,此结构被称之为PE结构。PE的意思是Portable Executable(可移植的执行体),所有Win32执行体都是用PE文件格式,其中包括SYS、DLL、EXE、COM、OCX等。(不管是学习逆向、破解原创 2015-05-07 15:48:03 · 6287 阅读 · 0 评论 -
Win32使用Psapi库枚举系统进程信息
一、枚举当前的所有进程(64位的程序暂时不会处理) 通过EnumProcesses得到当前所有的进程的进程ID,然后调用OpenProcess通过进程ID得到进程句柄,再调用EnumProcessModules来得到该进程的模块句柄,GetModuleBaseName通过进程模块句柄得到进程的名字,GetModuleFileNameEx通过进程模块句柄得到进程的可执行文件名。上面所有转载 2015-05-07 14:35:49 · 995 阅读 · 0 评论