- 博客(72)
- 资源 (1)
- 收藏
- 关注
原创 一个维护成本低,容易修改的makefile
我对makefile的理解很简单:目标的依赖关系与目标创建规则。列一下此前在makefile使用上遇到过的槛,希望看到这篇文章的人不再遇到:1、如何将中间文件输入到一个指定的目录。2、如何遍历目录获得构建的目标。3、如何生成依赖关系。
2014-01-14 17:56:54 1050
原创 对select接口定义的思考
linux发行版是centos6.x 64。select是一种常见的IO复用技术。虽然已经过时了,但还是有一些借鉴意义的。函数原型如下:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);nfds:最
2014-01-05 11:16:17 1517
原创 操作系统学习笔记:存储管理
类似进程线程是对CPU的抽象。存储管理,是操作系统对存储器(内存)的抽象。读书时对分页,分段,这些概念一知半解。很重要的原因是我没有去思考,为什么要有这些概念?它们是为了解决什么问题?技术的本质是分解问题,抽象问题,乃至解决问题。而分页,分段这些抽象,就是为了解决一些具体的问题而建立的。问题1:用户程序直接访问物理地址,破坏其它程序(操作系统)内存。解决方案:保护与重定位。
2013-04-30 11:45:07 1117 1
原创 map与unordered_map效率的比较
之前在某blog看到map在非常少量数据下插入效率高于unordered_map。自己测了一下并非如此,在设置合适的桶数的情况下,有如下结论:1、插入效率unordered_map任何情况下均优于map,数据越多越明显。2、遍历效率map略优于unordered_map。补充:1、只在 g++ 4.4.6下测试,-o2与无编译器优化结果一致。2、没有计算rehash与计算素
2012-11-21 22:37:49 4171
原创 记录一下自己开发环境(centos6.2)的配置
1、自启动服务。项目用到了mongodb,个人以后台服务方式启动。步骤如下:[root@enjolras init.d]# pwd/etc/init.d[root@enjolras enjolras]# vim mongodb#!/bin/bash#chkconfig: 2345 90 10#description: mongodb_service#Start Mong
2012-08-29 20:57:29 891
原创 ABCABC…
迅雷笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。Windows(VC9下编译运行通过):#include #include #include using namespace std;#define PRINT_TIMES 10/
2012-04-13 10:10:00 1205
转载 linux 多线程编程
转自:http://www.cnblogs.com/BiffoLee/archive/2011/11/18/2254540.html1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。
2012-04-12 09:29:49 668
原创 静态库包含静态库
都知道静态库是不能包含动态库的,那么静态库能不能包含静态库呢?以静态库的本质来说,理应是可以的,经过一番试验之后确定可行:第一步:创建静态库 libother.aother.h:#ifndef OTHER_H#define OTHER_Hextern "C"{ void vFuncOther();}#endifother.cpp:#inclu
2012-02-29 22:53:33 3930
原创 glibc版本冲突导致的Floating point exception
readhat5下编译的程序在readhat4下运行提示Floating point exception.确认为gcc版本冲突导致。解决办法如下:加入链接选项:-Wl,--hash-style=sysv[enjolras@localhost qt3test]$ gcc --help用法:gcc [选项] 文件...选项:...... -Wl,
2012-02-09 00:11:54 2492
原创 Linux学习记录
初学Linux,Hello World都弄了很久,此处记录一下。首先要注意的是,目录名不要带空格,否则需要加上转义符,这导致了此前的make不成功。shell的出错提示如下:[enjolras@TMServer Test Test]$ makemake -C /lib/modules/2.6.9-42.ELsmp/build M=/home/enjolras/Test Test m
2012-01-19 09:06:35 1267
转载 Win32下OpenSSL的安装方法
Win32下OpenSSL的安装方法环境: VC++, ActivePerl1. 下载openssl源代码: http://www.openssl.org/2. 配置D:\openssl-0.9.8a>perl Configure VC-WIN32D:
2011-09-06 15:51:19 966
原创 关于工作的一些碎碎念
技术上已经很久没提升了,最近实在比较忙,也学到了很多技术之外的东西。以下内容不断更新修改:1、不与上级讨论技术细节,只反馈什么时候做,需要多久。2、不随便提问题,问问题之前理清思路,目的性要明确。3、与部门外的同事,比较重要事项的交流一
2011-07-27 22:25:07 674
原创 CMutex CSingleLock
如下为CMutex的类定义class CMutex : public CSyncObject{ DECLARE_DYNAMIC(CMutex)// Constructorpublic: /* explicit */ CMutex(BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);// Implementationpublic:
2011-05-31 22:02:00 5817 3
原创 GetBuffer 与 ReleaseBuffer
之前对GetBuffer与ReleaseBuffer的理解有误也是因为受了网上的误导。ReleaseBuffer并不会释放空间!Getbuffer(int nMinBufferLength)函数作用:分配空间并返回字符串首地址指针。若为默认参数,则若nMinBufferLength比当前已分配空间小,则当前分配空间不变。若比当前分配空间大,则分配不小于nMinBufferLength的空间。VC9中会每次分配空间的时候会多分配一点避免频繁分配空间,而VC6中是指定多少就是多少,这点最好通过测试代码验证一下。
2011-04-21 21:39:00 2681
原创 在使用一个全局底层键盘钩子dll时遇到的问题
钩子的dll代码是网上找的,Google TrayKeys即可。因为不想用静态链接dll的方式,于是用LoadLibrary GetProcAddress等函数。与公司另一个Hook的dll的载入方式作比较,写下了一些载入的代码。结果GetProcAddress返回的地址为空,导致的原因是GetProcAddress的传入参数必须是name mangling之后的标识符才能正常导入函数,关于详细点的信息可以看下面的这个链接。http://blog.csdn.net/enjolras/archive/2010
2011-02-26 13:17:00 1115
原创 split函数模板版本
//功能:split的TCHAR模板版本,用splitter将字符串分割成多个,并分别压进vector容器中//返回值:容器中的字符串数量。//参数1:需要被分割的字符串//参数2:splitter//参数3:vector容器的引用,结果放进参数3中//参数4: 是否计算末尾的splittertemplate unsigned int split( const TCHAR* str, const TCHAR* delim, std::vector& results, bool empties = false
2011-02-21 20:36:00 749
转载 模板的特化与偏特化
<br />转自:http://apps.hi.baidu.com/share/detail/21329483<br />Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集.<br />1.模板的特化(template specialization):<br /> 例如,定义如下的一个模板:<br /> template<class Window, class Controller><br /> class Wi
2011-02-21 20:09:00 682
原创 inline关键字
首先说一下使用inline关键字的好处:1、预处理(define)只是单纯的代码替换,使用inline可以解决define宏只是替换代码产生的问题,因为他像函数一样运作。2、inline不需要承担函数调用的开销。本质上它也是代码展开。inline关键字的坏处:1、代码膨胀inline void test(){ std::cout}test();//将产生如下汇编代码004012B1 mov eax,dword ptr [__imp_std::endl (403084h)] 004012B6
2011-01-29 16:05:00 1694
原创 string头文件与cstring头文件
首先说string的头文件1、包装了std的C++头文件2、旧的C头文件3、旧C头文件的std版本,切记,这不是cstring的头文件
2011-01-28 21:34:00 14708
原创 CFILEFIND的排序——递归与循环遍历目录中函数的剥离
由于CFILEFIND在查找文件的时候返回的顺序不能确定,所以我们要对CFILEFIND的结果放入容器进行排序。以下是CFILEFIND函数的说明The FindNextFile function searches for files by name only; it cannot be used for attribute-based searches. It searches both the long and short file names.In rare cases, file attribute
2011-01-26 12:03:00 2593
原创 内存泄露解决记录——BSTR字符串释放与VARIANT类型的释放
发现的内存泄露有两种,一种是上篇提到的,某些窗口没有用DestroyWindow来释放资源,而是自己写的一个ForceClose函数,这导致了某些函数没被调用,比如PostNcDestroy。另外就是一个内嵌浏览器中使用到的BSTR字符串没有释放造成的问题。String Manipulation Functions Descriptions SysAllocStringCreates and initializes a string.SysAllocStringByteLenCreates a zero-t
2011-01-19 11:58:00 3007
原创 内存泄露解决记录——窗口资源释放
前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题。http://blog.csdn.net/enjolras/archive/2011/01/05/6117628.aspx这篇文章起到了很好的指引作用,让我对MFC里宏观方面的释放有了一定了解。总结一下就是:1、推荐用DestroyWindow来销毁窗口(或者从窗口派生的对象)。2、重载PostNcDestroy函数通过调用基类的PostNcDestroy函数,如:Cwnd::PostNcDestroy,以及通过delete th
2011-01-07 13:09:00 2896
原创 调试用函数:用对话框显示LastError
网上有几个都不太对,下面的代码已经测试通过inline void ShowErrMsg() { TCHAR errorBuffer[1024];memset(errorBuffer, 0, 1024*sizeof(TCHAR));LPVOID lpMsgBuf;DWORD dw = GetLastError();FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_N
2011-01-05 13:00:00 2382
转载 Technical Notes 17 : Destroying Window Objects(销毁窗口对象)
MSDN连接:http://msdn.microsoft.com/en-us/library/5zba4hah.aspx转帖连接:http://blog.csdn.net/badboyfind/archive/2007/11/28/1906298.aspxDestroying Window Objects(销毁窗口对象)[1]TN017: Destroying Window Objects销毁窗口对象This note describes the use of the CWnd::PostNcDestroy
2011-01-05 12:50:00 1294
原创 MFC遍历目录
<br />很久之前就用到了,今天再次用到遍历目录,记录如下:<br />若用*.jpg或者类似的,不能找到子文件夹,因为目录不在*.jpg的范围内。<br />isdot是用来判断是否./或者../,每个文件夹都有这样两个隐藏的目录,代表当前目录与上级目录,若不排除这两种情况将导致死循环。<br /> <br />void CTestDlg::ergodicDir(CString strDir)<br />{<br /> CFileFind tempFind; <br /> TCHAR sTempFil
2010-12-28 18:09:00 1117
原创 C++基础知识复习 const关键字
没事翻了下C++ primer,开卷有益吧,加深下印象,留个复习记录如下:1、const 指针与指向 const对象的指针const int * p;/*指向const int 的指针*/int * const p;/*指向int的const指针*/记忆方法:从右往左读,*读作is a pointer to。2、const形参在非引用或非指针传值时,const修饰符无意义,因为复制传值的时候,不可能改变实参的值。const int &与int &不同可作为区分函数重载的标识。没有int const &,引用
2010-12-23 21:04:00 581
原创 对读取的配置字符串批量处理的可变参数函数
代码很清楚了,本来是每个地方都用CString作临时变量再Replace,后面改成用一个函数集中处理,记录如下
2010-12-22 13:00:00 535
原创 Debug调试输出函数
大家都知道trace宏,OutputDebugString,但是用起来有点不方便,很多时候都要输出某个变量的值,所以写一个Debug用的调试函数就很有必要了。比如,写一个AfxTrace放进globalFunc类方便调试。代码如下globalFunc.h#include class CGlobalFunc{public:void static __cdecl AfxTrace(LPCTSTR lpszFormat, ...);protected:private:};globalFunc.cpp#includ
2010-12-19 20:37:00 1141
原创 标题暂无,日后再总结
<br />在用一个vc6工程代码的时候出现了如题的错误,google之后发现大部分文章都是说是字符集问题。而实际的问题是vector< char >的iterator不能被转化为char指针,解决办法很简单,由类似 (vectorChar.Begin()+i) 改为 (&vectorChar.Front()+i)的方法解决。<br />本也不是个问题,可为什么vc6可以转而vc9要改动呢?望有牛人告知。<br /> <br />另外还遇到一个错误,本来截了图,忘记传网盘了,回公司补充吧。<br />问题在
2010-11-24 20:59:00 687
转载 Observer Pattern
转自:http://www.cnblogs.com/zhenyulu/articles/73723.html一、 观察者(Observer)模式观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。一个软件系统常
2010-11-21 20:10:00 537
转载 Bridge Pattern
<br /><br /> 转自http://www.cnblogs.com/zhenyulu/articles/62720.html一、 桥梁(Bridge)模式<br />桥梁模式是一个非常有用的模式,也是比较复杂的一个模式。熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。<br />注:《Java与模式》一书认为Bridge模式不是一个使用频率很高的模式,我不太赞同,我认为B
2010-11-21 20:07:00 525
转载 VC 查找进程,关闭进程
<br /><br />比较简单的东西,不管怎么做个记录,本来是想通过发消息的方法关闭,因为是控制台程序,所以就直接 TerminateProcess了。<br />//<br />// FindProcess<br />// 这个函数唯一的参数是你指定的进程名,如:你的目标进程<br />// 是 "Notepad.exe",返回值是该进程的ID,失败返回0<br />//<br />DWORD FindProcess(char *strProcessName)<br />{<br /> DWORD
2010-11-21 20:05:00 1011 1
原创 启动程序进程不显示程序窗口
<br /><br />工作中遇到的问题。<br />对这种简单的烂大街东西了,百度百科还是蛮好用的。不过对自己解决问题的思路与效率还是满意的。代码如下:<br />void CtestHideDlg::OnBnClickedButton1()<br />{<br />// TODO: 在此添加控件通知处理程序代码<br />//MessageBox(_T("1111"));<br />CString strFilePath;<br />strFilePath=GetModulePath (_T("hfs.
2010-11-21 20:04:00 3999
转载 AfxBeginThread和AfxEndThread
<br /><br />启动线程:<br /> <br />CWinThread* AfxBeginThread( 线程函数,this );<br /> <br />线程的退出:<br /> <br />在刚刚使用的时候,退出线程的方法有问题,导致退出的时候异常。<br /> <br />下面说线程退出的方法:<br /> <br />1.线程函数返回<br /> <br />线程都在死循环中,当满足一定条件时,return,也会将线程结束。<br /> <br />2.AfxEndThread<br />
2010-11-21 19:43:00 2379
转载 设置窗口类名
<br /><br /> 在DOC/VIEW结构的应用程序中,要修改主窗口(CMainFrame)的类名,可以利用超类化技术。关于超类化还可以参考浅谈MFC中超类化技术的实现。但是超类化技术对基于对话框基础的应用程序是没有效果。如何修改呢?先看看用超类化改DOC/VIEW结构形式。超类化技术一般有如下几个步骤:<br /> 1. 通过调用 GetClassInfoEx 来获得想要进行超类化操作的窗口类的信息。函数GetClassInfoEx 需要一个指向 WNDCLASSEX 结构的指针,用于当成
2010-11-21 19:43:00 1763
转载 获得窗口指针
<br /><br />获得CWinApp: <br /> <br />-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp <br /> <br />-在其它类中只能用AfxGetApp() <br /> <br /> <br /> <br />获得CMainFrame: <br /> <br />-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd <br /> <br />-在CChildFrame中可
2010-11-21 19:41:00 1001
转载 CallJs
<br /><br />C++ call JavaScript,介绍2种解决方案:1种嵌Webkit作浏览器(纯QT方法);另1种嵌IE控件作为浏览器(适用于非QT,但我是在QT里使用的)。<br /> <br /> <br /> <br /> 这个需求比较冷门,所以资料少,搞起来比较折腾人。<br /> <br /> <br /> <br /> 解放方案1:使用Webkit library (可以说是纯QT实现)<br /> <br /> <br /> <br /> 代码量不多,直接贴代
2010-11-21 19:40:00 1249
转载 ID--HANDLE--HWND三者之间的互相转换
<br />id->句柄hWnd = ::GetDlgItem(hParentWnd,id);<br />id->指针CWnd::GetDlgItem();<br />句柄->idid = GetWindowLong(hWnd,GWL_ID);<br />句柄->指针CWnd *pWnd=CWnd::FromHandle(hWnd);<br />指针->IDid = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);<br /> id = pWn
2010-11-21 11:42:00 1097
转载 DISP_FUNCTION
<br /> <br /><br />DISP_FUNCTION<br /> <br />DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )<br /> <br />#include <afxdisp.h><br /> <br />参数:<br />theClass类的名字。<br />pszName函数的外部名字。<br />pfnMember成员函数的名字。<br />vtRetVal指定了函数返回类型的值。<br />v
2010-11-21 11:42:00 8696 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人