East's Blog
At first, you may struggle to understand how to do each pratice. They may look easy on paper, but putting some practices into action may be difficult. Keep practicing until they're easy.

2008年12月22日

DriveBrowsing
CImageList:可以用于给TreeCtrl节点添加Icon
创建ImageList 16 * 16的, 8色,初始化为9个,增长频率是9
m_pImageList.Create(16, 16, ILC_COLOR8 | ILC_MASK,  9, 9);
向ImageList中添加Icon
m_pImageList.Add(pApp->LoadIcon(ICO_CDDRV));
m_pImageList.Add(pApp->LoadIcon(ICO_CLSDFLD));
m_pImageList.Add(pApp->LoadIcon(ICO_DRIVE));
m_pImageList.Add(pApp->LoadIcon(ICO_FLOPPYDRV));
m_pImageList.Add(pApp->LoadIcon(ICO_MYCOMP));
m_pImageList.Add(pApp->LoadIcon(ICO_OPENFLD));
m_pImageList.Add(pApp->LoadIcon(ICO_TEXTFILE));
向TreeCtrl添加ImageList
GetTreeCtrl().SetImageList(&m_pImageList , TVSIL_NORMAL);

GetLogicalDrives Function

Retrieves a bitmask representing the currently available disk drives.

 

DWORD WINAPI GetLogicalDrives(void);


GetDriveType Function

 

Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.

To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty and specify the SPDRP_REMOVAL_POLICY property.

 

UINT WINAPI GetDriveType(
  __in          LPCTSTR lpRootPathName
);

posted @ 2008-12-22 00:21 eastsong 阅读(224) | 评论 (0) | 编辑 收藏
 

2008年12月20日

MCI

mciSendString

The mciSendString function sends a command string to an MCI device. The device that the command is sent to is specified in the command string

mciSendString("set cdaudio door open",NULL,0,0);

mciSendString("set cdaudio door closed",NULL,0,0);

MCI

The Media Control Interface (MCI) provides standard commands for playing multimedia devices and recording multimedia resource files. These commands are a generic interface to nearly every kind of multimedia device. 


NOTIFYICONDATA Structure  产生类似托盘的效果


Contains information that the system needs to process taskbar status area messages.

posted @ 2008-12-20 23:43 eastsong 阅读(221) | 评论 (0) | 编辑 收藏
 
显示系统中所有进程
CreateToolhelp32Snapshot :对系统中的进程“拍照”
Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.

 

HANDLE WINAPI CreateToolhelp32Snapshot(
  __in          DWORD dwFlags,
  __in          DWORD th32ProcessID
);
Process32First : 枚举第一个进程

Retrieves information about the first process encountered in a system snapshot.

 

BOOL WINAPI Process32First(
  __in          HANDLE hSnapshot,
  __in_out      LPPROCESSENTRY32 lppe
);

Process32Next : 递归枚举随后的进程

Retrieves information about the next process recorded in a system snapshot.

 

BOOL WINAPI Process32Next(
  __in          HANDLE hSnapshot,
  __out         LPPROCESSENTRY32 lppe
);
posted @ 2008-12-20 23:13 eastsong 阅读(244) | 评论 (0) | 编辑 收藏
 
AOP
分散关注
将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行就可以啦。
Aop就是这种实现分散关注的编程方法,它将“关注”封装在“方面”中。
AOP是OOP的延续,是Aspect Oriented Programming 的缩写,意思是面向方面编程。AOP是GOF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一中实现。

举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。

  为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。

  使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下:

abstract class Worker{

  abstract void locked();
  abstract void accessDataObject();
  abstract void unlocked();

}


  缺点:
  • accessDataObject()方法需要有“锁”状态之类的相关代码。
  • Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。
  • 重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。

    仔细研究这个应用的“锁”,它其实有下列特性:
  • “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。
  • “锁”行为其实是和具体访问类的主要功能可以独立、区分开来的。
  • “锁”功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。如下图:
     

  因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的程序结构就是aspect(方面)

  在这个应用中,“锁”方面(aspect)应该有以下职责:

  提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。

AOP应用范围

  很明显,AOP非常适合开发J2EE容器服务器,目前JBoss 4.0正是使用AOP框架进行开发。
  具体功能如下:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

AOP有必要吗?

  当然,上述应用范例在没有使用AOP情况下,也得到了解决,例如JBoss 3.XXX也提供了上述应用功能,但是没有使用AOP。

  但是,使用AOP可以让我们从一个更高的抽象概念来理解软件系统,AOP也许提供一种有价值的工具。可以这么说:因为使用AOP结构,现在JBoss 4.0的源码要比JBoss 3.X容易理解多了,这对于一个大型复杂系统来说是非常重要的。

  从另外一个方面说,好像不是所有的人都需要关心AOP,它可能是一种架构设计的选择,如果选择J2EE系统,AOP关注的上述通用方面都已经被J2EE容器实现了,J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。

posted @ 2008-12-20 22:47 eastsong 阅读(128) | 评论 (0) | 编辑 收藏
 

2008年12月17日

软件能力成熟度模型
一 基本概念

软件过程(Software Process)
软件过程可定义为企业设计,研制和维护软件产品及相关资料文档的全部生
产活动和工程管理活动。

软件过程能力(Software Process Capablility)
企业实施软件过程所能实现预期目标的程度。它可用于预测企业的软件过程水平。

软件过程行为(Software Process Performance)
企业在项目开发中遵循软件过程所能得到的实际结果。

软件过程成熟度(Software Process Maturity)
软件过程行为可被定义,预测和控制并持续行提高的程度。它主要用来表明不同项目所遵循的软件过程的一致性。

软件能力成熟度等级(Software Capablility Maturity levels)
企业的软件开发在由低到高成熟化演进过程中所普遍面临的具有一定成熟度特征的平台。

成熟与不成熟(Mature and Immature)
不成熟的标志有-  没有明确的软件过程体系可以依据,无法对生产进行预测;不严格执行生产过程;质量无法保证;无健全的过程控制及质量控制体系;项目开发没有准则可遵循;开发结果主要依据项目小组及个人的带有主观因素的能力发挥。
成熟的标志有-项目开发是依据企业早已明确的过程准则来实施;开发结果较少的依赖个人能力和自然因素;项目由过程控制并可对整个生产作出预测;产品质量得到有效的监控();过去的开发项目中所获经验得以积累并可系统地用于现行和未来的项目之中。

配置管理(Configuration Management)
包括以下管理行为: 对某个配置项的功能和物理特性进行识别和编档;对这些特征的变动进行控制;对变动和事实进行记录、汇报;验证需求计划的实现。

偏差(Deviation)
针对开发中的计划、标准、规划等的明显偏离和变动。

同业复审(Peer Review)
软件项目开发成员的同行遵循某一规则对项目产品所作的检查,用于发现缺陷所在。

风险管理(Risk Management)
运用风险概率方法分析评估项目开发设计中的各类风险,包括风险识别,风险分析,风险等级排序和风险控制。

软件工程过程组(Software Engineering Process Group)
协助开发机构对所采纳的软件过程进行制定、分析、监控和改进的专家组。
它应该直接向机构的最高领导层负责。

软件生命周期(Software Life Cycle)
指软件开发所涉及的全过程,包括从产品设计到产品终结的整个周期,一般分为概念阶段,需求阶段,设计阶段,实施阶段,测试阶段,安装调试阶段,运行维护阶段,终止阶段。

软件需求(Software Requirement)
用户为实现某种目标或者解决某种问题要求软件给予满足的条件。
posted @ 2008-12-17 17:43 eastsong 阅读(330) | 评论 (0) | 编辑 收藏
 

2008年12月16日

Intrusion detection system
    侵入检测系统是用来通过网络检测非法访问、操作的软件或者硬件系统。攻击的形势大都是以黑客、恶意软件等。侵入检测系统不能在加密的网络中检测攻击。侵入检测系统被用来检测几种类型的恶意行为,这些恶意行为能获得计算机系统的信任。他们会攻击网络的脆弱服务,应用程序的数据驱动,提升权限,未经授权的登陆,访问敏感文件和恶意软件等(病毒,木马或者蠕虫)。IDS由几部分构成:传感器,产生安全事件;控制台程序,监视事件和警告、控制传感器;中心发动机,记录传感器登陆事件和使用系统规则产生来自安全事件的警告。有几种方式划分IDS,取决于传感器的类型和位置以及发动机产生警告的方法。很多简单IDS的实现都是将这三部分组件合并成一个简单的设备或者装置。侵入检测系统的类型: 在以网络为基础的侵入检测系统中,由于传感器是网络的瓶颈而被监视,通常在隔离区或者网络边界中。传感器捕获网络信息流量并且分析恶意流量中包的数据内容。在系统中,PIDS和APIDS被用来监视网络流量和协议,非法或者不当的网络流量或者语言结构。在以主机为基础的系统中,传感器有软件代理构成,用来监视主机的所有活动。  网络侵入检测系统是一个独立的平台。能够通过检查网络流量和监视多个主机来辨别侵入。
posted @ 2008-12-16 22:52 eastsong| 编辑 收藏
 

2008年11月3日

Design Pattern - Chapter One 简单工厂模式
简单工厂: 用一个单独的类来做创造实例的过程,就是工厂。

优点:在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

例子:实现计算器代码

1 计算和显示分开
2 灵活地修改和扩展(开放封闭原则)
3 单一原则(加减乘除各个自成一类)

/**
*    File    : IOperation.h
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: interface of operation
*/

#if !defined _IOPERATION_H_
#define _IOPERATION_H_

class IOperation
{
public:
    IOperation(double _doubleA = 0, double _doubleB = 0);
    virtual ~IOperation(){};
   
    virtual double Execute() = 0;

    void SetA(double _doubleA);
    double GetA();

    void SetB(double _doubleB);
    double GetB();

protected:
private:
    double m_doubleA;
    double m_doubleB;

};

#endif

/**
*    File    : IOperation.cpp
*    Author    : Eastong
*    Date    : 11/3/2008
*    Function: the realization of IOperation
*/

#include "IOperation.h"


IOperation::IOperation(double _doubleA /* = 0 */, double _doubleB /* = 0 */)
{
    m_doubleA = _doubleA;
    m_doubleB = _doubleB;
}

void IOperation::SetA(double _doubleA)
{
    m_doubleA = _doubleA;
}
double IOperation::GetA()
{
    return m_doubleA;
}

void IOperation::SetB(double _doubleB)
{
    m_doubleB = _doubleB;
}

double IOperation::GetB()
{
    return m_doubleB;
}

/**
*    File    : CAdd.h
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: the declaration of Add operation
*/
#if !defined _CADD_H_
#define _CADD_H_

#include "IOperation.h"

class CAdd : public IOperation
{
public:
    virtual double Execute();
protected:
private:
};

#endif

/**
*    File    : CAdd.cpp
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: the realization of Add operation
*/

#include "CAdd.h"

double CAdd::Execute()
{
    return GetA() + GetB();
}

/**
*    File    : CSub.h
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: the declaration of sub operation
*/
#if !defined _CSUB_H_
#define  _CSUB_H_

#include "IOperation.h"

class CSub : public IOperation
{
public:
    virtual double Execute();
protected:
private:
};

#endif

/**
*    File    : CSub.h
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: the realization of sub operation
*/

#include "CSub.h"

double CSub::Execute()
{
    return GetA() - GetB();
}

/**
*    File    : CMul.h
*    Author  : Eastsong
*    Date    : 11/3/2008
*    Function: the declaration of mul operation
*/
#if !defined _CMUL_H_
#define  _CMUL_H_

#include "IOperation.h"

class CMul : public IOperation
{
public:
    virtual double Execute();
protected:
private:
};

#endif
/**
*    File    : CMul.cpp
*    Author  : Eastsong
*    Date    : 11/3/2008
*    Function: the realization of mul operation
*/
#include "CMul.h"

double CMul::Execute()
{
    return GetA() * GetB();
}

/**
*    File    : CDiv.h
*    Author  : Eastsong
*    Date    : 11/3/2008
*    Function: the declaration of div operation
*/
#if !defined _CDIV_H_
#define _CDIV_H_

#include "IOperation.h"

class CDiv : public IOperation
{
public:
    virtual double Execute();
protected:
private:
};

#endif

/**
*    File    : CDiv.cpp
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: the realization of div operation
*/
#include "CDiv.h"

double CDiv::Execute()
{
    if (0 != GetB())
    {
        return GetA() / GetB();
    }
    else
    {
        /**
        * I do not know how to throw the exception using c++
        */
        //throw Exception();

        return 0;
    }
}

/**
*    File    : OperationFactory.h
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: factory of create operation object
*/

#if !defined _OPERATION_FACTORY_H_
#define _OPERATION_FACTORY_H_

#include "IOperation.h"

class OperationFactory
{
public:
    static IOperation * CreateOperation(char  op);
protected:
private:
};

#endif

/**
*    File    : OperationFactory.cpp
*    Author    : Eastsong
*    Date    : 11/3/2008
*    Function: factory of create operation object
*/

#include "OperationFactory.h"
#include "CAdd.h"
#include "CSub.h"
#include "CMul.h"
#include "CDiv.h"

IOperation * OperationFactory::CreateOperation( char op)
{
    IOperation * operation = 0;

    switch(op)
    {
    case '+' :
        operation = new CAdd();
        break;
    case '-':
        operation = new CSub();
        break;
    case '*':
        operation = new CMul();
        break;
    case '/':
        operation = new CDiv();
        break;
   
    default:
   
        break;
    }

    return operation;
}

posted @ 2008-11-03 19:44 eastsong 阅读(165) | 评论 (0) | 编辑 收藏
 

2008年11月2日

转: 史上最牛夫妻生活协议
 史上最牛夫妻生活协议
  1.吵架不当着父母,亲戚,邻居的面吵,在公共场所给对方面子。
 
  2.不管谁对谁错,只要一吵架,男方必须先轻声轻气哄女方一次,女方才能马上冷静下来,否则女方一看到男方哇啦哇啦女方也忍不住哇啦哇啦,一旦造成严重后果,全部由男方负责。
 
  3.在家里吵架不准一走了之,实在要走不得走出小区,不许不带手机和关机。
 
  4.尊敬对方的父母长辈,吵架不开心不能对父母无礼。
 
  5.有错一方要主动道歉,无错一方在有错方道歉并补偿后要尽快原谅对方。

 
  6.双方都有错时要互相检讨,认识到错误并道歉后由男方主动提出带女方出去散心。
 
  7.要出气不准砸东西,只能吃东西,实在手痒只能砸枕头。
 
  8.吵架尽量不隔夜,晚上睡觉时男方必须主动抱女方,女方生气百般推让男方也不能就此放弃,一定要哄到女方睡着,做上美梦。。。

 
  9.每周都要给对方按摩一次,因为大家经常吵架都很辛苦,男方手艺不好的话可以跟盲人师傅学,严禁和发廊女学!
 
  10.吵架时男方不准挂电话,如果挂了要马上打回去,并表示歉意,吵架时女方如果挂了电话,男方必须在1分钟内打给女方,电话不通打手机,总之不能气绥,屡挂屡打,但是女方也要给男方面子,每次挂电话次数不大于5次。

(公约条款暂时为以上这几条,可由女方无理由无时间限制的更改,男方有权利提出异议,但是异议是否被采纳最终解释权在女方手里)
                            
posted @ 2008-11-02 11:53 eastsong 阅读(198) | 评论 (5) | 编辑 收藏
 

2008年10月31日

Design Pattern
看完大话设计模式有好一段时间了,不过总觉得理解的不透彻,可是重新翻看又说不明白哪里不理解。
大话设计模式基本涵盖了目前流行的大部分设计模式,现在脑子里能想起来的有:
简单工厂、策略模式、工厂模式、桥接模式、享元模式、模板、观察者、单键模式、抽象、代理、指导者、命令
其中里面还讲到一些设计原则,如:DSP、LSP、OCP等。
在项目设计中,我也尝试去应用了里面的一些模式,遇到问题,就比较着看和大话模式里那种比较相似,就应用上了。
到底如何才是真正理解设计模式了呢?有的时候我是很糊涂。

posted @ 2008-10-31 16:18 eastsong 阅读(129) | 评论 (0) | 编辑 收藏
 

2008年10月30日

为了做件有成就的事
昨天去听了超图的校园宣讲会,无非都是宣扬些本公司的现状,未来的发展,以及招聘人员来到本公司后的待遇等等。我没太自己关注这些,大部分时间是在看新买的Multithreading Appinlication in Windows,最近很爱看书。不过宣讲人说了句话,让我印象很是深刻,他说,时不时就该做些有成就的事,否则时间长了,人都会颓废的,原话不是这么说的,大意而已。我觉得这句话很有道理,在学校这么长时间,从来没觉得什么事让自己感觉很有成就;工作了这么久也是一样,天天想着完成任务就好,从来没想过应该超前完成点任务。大部分仅仅是为了维持生活现状,得过且过而已。时间长了,反而觉得很是无聊,没有什么新意。
受这句话的启发,我决定今天就该做点有成就感的事情,把前两天拖拉的工作完成了。其实任务说起来很简单:项目在开发中用到了sqlite3.dll,不过在引用这个dll时,项目中用的是在project、setting 中设置的方式,(dll调用分两种,不清楚这种调用是隐式的还是显示的,没分清),所以项目程序只有在sqlite3.dll 存在的情况下,才可以运行,否则运行不起来,会报错。 项目中我的任务是做升级程序Updater.exe,在升级程序中也需要升级数据库,因此也使用了sqlite3.dll,也是按的前面的调用方式。这种调用方式带来的弊端是updater.exe在升级主程序时,可能会出现问题,sqlite3.dll的升级可能失败(正在被updater.exe使用)。我曾想试着按另外一种方式调用sqlite3.dll导出的函数,但终究觉得导出函数的方式很复杂,而且sqlite3的导出函数封装的不好,写起来很费劲(这之前由于sqlite3.h 封装不好,我们项目组一直引用它的一个封装类CppSqlite3)。
如果按着sqlite3 导出函数(LoadLibrary,FreeLibrary)这种方式来做的话,问题来了:
1 导出函数的指针必须拿到
2 以前写的代码引用到CppSqlite3 的最好不要影响到

想了很久,终于我想到一个方法来解决这个问题,遂开始实施(后面在描述解决过程吧),可是由于导出函数太多,写的我都快吐血了,一直到了早上五点,还没全部弄完,实在是坚持不住了,就想赶紧睡会吧,一会还得上班呢。遂倒头睡去,没成想在睁开眼睛时,已是8点多了。



posted @ 2008-10-30 13:15 eastsong 阅读(302) | 评论 (2) | 编辑 收藏
 
仅列出标题  下一页
 
<2025年5月>
日一二三四五六
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

 导航

  • C++博客
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 11
  • 文章: 0
  • 评论: 7
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿(1)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2008年12月 (6)
  • 2008年11月 (2)
  • 2008年10月 (3)

相册

  • east

搜索

  •  

最新评论

  • 1. re: 转: 史上最牛夫妻生活协议
  • 哎,本来挺好玩的字,弄得乌烟瘴气的就不好了。好文,转过来,给大家看,挺好的事,无端生出这些来(我是纯属搞笑的,第一个评论),就不好了。lz应该继续遍历好文章,转到这里娱乐大众,再接再厉!
  • --taopier
  • 2. re: 转: 史上最牛夫妻生活协议
  • @Condor
    我有做得不对的地方,你可以告诉我,为什么骂我呢 ?
  • --eastsong
  • 3. re: 转: 史上最牛夫妻生活协议
  • @Condor
    why did you say that “可耻”?
  • --eastsong
  • 4. re: 转: 史上最牛夫妻生活协议
  • 可耻
  • --Condor
  • 5. re: 转: 史上最牛夫妻生活协议
  • 剽窃可耻
    偷窥无罪
    hoho lol
  • --taopier

阅读排行榜

  • 1. 软件能力成熟度模型(330)
  • 2. 为了做件有成就的事(302)
  • 3. 显示系统中所有进程(244)
  • 4. DriveBrowsing(224)
  • 5. MCI(221)

评论排行榜

  • 1. 转: 史上最牛夫妻生活协议(5)
  • 2. 为了做件有成就的事(2)
  • 3. Design Pattern(0)
  • 4. 新博客首发(0)
  • 5. Design Pattern - Chapter One 简单工厂模式(0)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 eastsong