随笔分类 -  windows编程技术

windows编程技术总结
LZMA demo挑选使用备忘
摘要:一、源码下载:http://sourceforge.net/projects/sevenzip/二、各种EXE及其功能代码里面有很多的dsw工程,功能不一,size不一,需要挑选合适的加入到自己的工程中,下边是今天对各个工程做测试得出的结果,汇总下有利于挑选,源码是lzma压缩算法的,部分信息可以从源码的lzma.txt文档里看到:1、C文件夹下的lzmautil编译出来的是:7lzma.exe,这个exe只能压缩、解压单个文件对单个文件。2、C文件夹下的7z编译出来的是:7zDec.exe,只能解压(可以是单个压缩包对多个文件)。/MD编译选项下的这个exe只有39KB。3、C文件夹下的sf 阅读全文
posted @ 2014-03-08 23:10 烛秋 阅读(2276) 评论(5) 推荐(0) 编辑
Singleton、MultiThread、Lib——实现单实例无锁多线程安全API
摘要:前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为singletone double check会出bug,本文做下记录备忘。 相关知识点:Singleto... 阅读全文
posted @ 2014-03-01 14:07 烛秋 阅读(1762) 评论(0) 推荐(0) 编辑
windows services
摘要:Windows Services 学习一、学习点滴1、本机服务查看:services.msc /s2、服务手动安装(使用sc.exe):sc create MemoryStatus binpath= c:\MyServices\MemoryStatus.exesc delete MemoryStatus3、把服务所在进程杀掉,服务也就停止了。4、服务删除,错误信息:D:\>sc delete Sample_Srv[SC] DeleteService FAILED 1072D:\>sc stop Sample_srv[SC] ControlService FAILED 1052解决: 阅读全文
posted @ 2013-10-26 20:34 烛秋 阅读(17634) 评论(0) 推荐(0) 编辑
windows下捕获dump之Google breakpad_client的理解
摘要:breakpad是Google开源的一套跨平台工具,用于dump的处理。很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析。一、使用 最简单的是使用进程内dump捕获,使用者只需要跟ExceptionHandler打交道,在自己的程序里定义一个ExceptionHandler对象,ExceptionHandler会挂上异常处理、CRT参数错误处理、purecall错误处理,当发生crash时,breakpad会写好dump,然后回调通知使用者。进程内dump并不推荐,但也不算太差,它在程序启动时就开启了一个“Handler thread”,等... 阅读全文
posted @ 2013-08-27 23:23 烛秋 阅读(7574) 评论(0) 推荐(1) 编辑
windows下捕获dump
摘要:一般要捕获异常只需要两个函数:SetUnhandledExceptionFilter截获异常;MiniDumpWriteDump写dump文件。但是由于CRT函数可能会在内部调用SetUnhandledExceptionFilter(NULL),解除我们程序设置的异常处理,这导致我们的程序无法完整捕获崩溃。另外,还有一部分非异常的CRT错误,不属于SEH异常捕获的范畴,需要通过_set_invalid_parameter_handler、_set_purecall_handler拦截,否则会弹出很丑陋的Runtime Error提示框。为保证所有异常都能由我们捕获,需要把SetUnhand.. 阅读全文
posted @ 2013-07-22 22:13 烛秋 阅读(12426) 评论(1) 推荐(2) 编辑
windows多线程,debug时设置线程名称
摘要:其他人想必会有这样的感觉,早上酣畅淋漓的写完一段代码,心情特别舒适,可是却发现了异常,然后开始debug直到忘记了吃饭,好心情就一点点被消磨掉。这种情况在写多线程代码的时候更是常见,一个工作线程的任务被层层封装,然后才被扔到工作线程队列,我从哪里来是不知道的,甚至于连我在哪里都不知道,设置线程名称,就是为了解决“我在哪里”的问题。在debug时,线程有了名称,查bug的效率会得到提升。 设置线程名称,只有短短的几行代码,windows已经做好了准备,只需要触发它。这么简单的东西其实没有必要写到博客里,但是最近我发现还是有不少人不知道、或者没想到去这么做的。 以上是废话,以下才是重点:#... 阅读全文
posted @ 2013-05-30 21:52 烛秋 阅读(2455) 评论(0) 推荐(0) 编辑
使用透明/半透明窗口/图片时遇到的一些问题
摘要:最近两周使用透明、半透明窗口比较多,在此之前我写代码都借助封装好了的皮肤库,而现在都是“手写”的——石器时代大冒险,遇到了一些困难,在此做总结。1、GDI函数对Alpha值的忽视。 GDI函数只有AlphaBlend api可以提供alpha通道的绘制,使用AlphaBlend可以实现32位位图的绘制。因为只有这个api能识别alpha通道,如果在一个MemDC上用DrawText绘制文本,这些文字区域的alpha值都为0,之后再使用AlphaBlend api把MemDC的位图拷贝到实际DC,就会导致文字区域异常,要么是透明了,要么是变成纯白色了。解决办法是:1、在能达到目的的前提下,从.. 阅读全文
posted @ 2013-05-28 01:18 烛秋 阅读(7311) 评论(0) 推荐(0) 编辑
windows下如何提高程序启动速度
摘要:启动速度是很重要的一个点,如何加快呢?有个简单的原理:局部性原理。在计算速度越来越快的今天,性能的瓶颈很多时候是在I/O上(SSD硬盘的机器明显比机械硬盘快很多),如果能减少程序运行过程中读取磁盘的次数,那就能有效提高速度。减少程序运行过程中读取磁盘次数,就是减少缺页(Page fault)错误,让运行过程中的多数数据提前加载到物理内存,所以有个词,叫做“预读”。一、系统对启动加速的支持1、Prefetch支持 每当应用程序启动发生硬缺页中断时,操作系统会记录应用程序访问的文件及其位置,这些信息会被记录在\\Windows\Prefetch下,譬如,我机器上很容易就找到了“CHROME.... 阅读全文
posted @ 2013-03-27 00:42 烛秋 阅读(5866) 评论(0) 推荐(1) 编辑
由“Pure Virtual Function Called” 考虑到的
摘要:2012-8-22cswuyg1. 派生类对象析构时,基类析构函数执行的前期会修改对象的虚函数表指针值 一般情况下(特指基类不使用novtable属性),debug编译出来的exe,派生类对象的析构,在析构基类部分的时候,对象的虚函数表指针值项会被修改成基类的虚函数表地址,然后再执行基类的析构函数体。其中高亮的那一行是修改对象的虚函数表指针值为基类虚函数表地址 release下编译出来的就不是这样子。以一个小测试程序为例,编译器做了优化,并没有在调用基类析构函数时做赋值。但不确定编译器是否会一直做优化,因为看到了派生类析构函数体实质内容执行之前对虚函数表指针值做了一次赋值,那么为什么在基... 阅读全文
posted @ 2012-08-22 12:32 烛秋 阅读(4042) 评论(0) 推荐(0) 编辑
不要在WM_ACTIVATE里调用可以触发活动转移的函数
摘要:2012-7-8cswuyg不要在WM_ACTIVATE里调用可以触发活动转移的函数一、来源 WM_ACTIVATE的问题6月19号发现了,当时发现窗口会收到两次WM_ACTIVATE消息,很是奇怪,但找不到入手点,就没有深入追究。前几天同事发现有个按钮点击了没反应,是因为WM_LBUTTONDOW消息丢失,导致按钮事件没有生成,这才发现是WM_ACTIVATE有问题,总算找到原因了。但这是为什么呢?这就需要详细分析了。二、详细分析 避免在WM_ACTIVATE里调用可能触发活动转移的函数(如:ShowWindow( SW_HIDE )); 有一个窗口A显示着,点击了跟窗口A使用同一个消... 阅读全文
posted @ 2012-08-20 13:39 烛秋 阅读(3131) 评论(0) 推荐(0) 编辑
父窗口隐藏、最小化时对子窗口(Parent或者Owner关系)的影响
摘要:2012-7-8cswuyg 半年多以前就遇到这个问题,当时由于时间关系没有做详细分析,又用其他方式打补丁解决问题,最近又遇到,总算不懒惰,写个demo看看到底怎么回事。一、窗口的Parent、Owner关系 窗口有两种可能的上下级关系,一种是Owner,一种是parent。 创建窗口时,有WS_POPUP属性的窗口,它的父窗口其实是Owner窗口。创建之后,可以通过SetParent,为它设置父窗口,这样子他就有父窗口(子窗口位置限制在父窗口中)又有POPUP属性。 创建窗口时,有WS_CHILD属性的窗口,它的父窗口就是父窗口。可以通过SetWindowLongPtr给它加上POP... 阅读全文
posted @ 2012-07-09 09:33 烛秋 阅读(6364) 评论(0) 推荐(1) 编辑
堆内存里的各种奇怪填充值
摘要:2012-6-27整理cswuyg前几天遇到过一种奇葩的代码,用0xFEEEFEEE来判断是否是悬垂指针,这种必须反对,太冒险了。另外填充值到底是什么呢?发觉要全面彻底分析,不是那么简单,最后只是把网络上的一些资料拿到这里,作为记录。一、Release下,用OllyDbg查看1、申请了50个字节的空间。可以看到被初始化为0xBAADF00D。2、把申请的内存释放之后,释放之后内存初始化为0xFEEEFEEE。二、debug下用VS2005查看1、申请了50个字节的空间。可以看到被初始化为0xcdcdcdcd2、把申请的内存释放之后,初始化为0xFEEEFEEE三、总结按照网络上某篇文章的说法: 阅读全文
posted @ 2012-07-07 19:29 烛秋 阅读(3259) 评论(1) 推荐(2) 编辑
/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
摘要:一、MD(d)、MT(d)编译选项的区别1、编译选项的位置以VS2005为例,这样子打开:1) 打开项目的Property Pages对话框2) 点击左侧C/C++节3) 点击Code Generation节4) 右侧第六行Runtime Library项目2、各个设置选项代表的含义编译选项包含静态... 阅读全文
posted @ 2012-02-03 01:11 烛秋 阅读(19735) 评论(1) 推荐(3) 编辑
xp、win7下如何取消屏保、取消电源管理
摘要:2011.12.11整理烛秋一、网络上流传的方法网络上流传的方法很多,也很复杂。之前在实现这个功能的时候在网络上寻找了很多,如下:http://blog.csdn.net/rainharder/article/details/6101317http://topic.csdn.net/t/20021009/15/1081843.html#r_7006146http://topic.csdn.net/u/20100414/12/A5265E43-6288-43A0-B337-C5DA0CF1D7DD.html#r_64661983http://topic.csdn.net/u/20100203/1 阅读全文
posted @ 2011-12-11 16:51 烛秋 阅读(16955) 评论(4) 推荐(0) 编辑
编写DLL所学所思(2)——导出类
摘要:2011.10.6烛秋一、导出类的简单方式这种方式是比较简单的,同时也是不建议采用的不合适方式。只需要在导出类加上__declspec(dllexport),就可以实现导出类。对象空间还是在使用者的模块里,dll只提供类中的函数代码。不足的地方是:使用者需要知道整个类的实现,包括基类、类中成员对象,也就是说所有跟导出类相关的东西,使用者都要知道。通过Dependency Walker可以看到,这时候的dll导出的是跟类相关的函数:如构造函数、赋值操作符、析构函数、其它函数,这些都是使用者可能会用到的函数。这种导出类的方式,除了导出的东西太多、使用者对类的实现依赖太多之外,还有其它问题:必须保证 阅读全文
posted @ 2011-10-06 02:44 烛秋 阅读(21123) 评论(5) 推荐(6) 编辑
编写DLL所学所思(1)——导出函数
摘要:dll的学习笔记(1)——导出函数 阅读全文
posted @ 2011-09-30 16:07 烛秋 阅读(14846) 评论(2) 推荐(9) 编辑