使用VS2010/VS2008等进行Office Automation方法

Posted: 五月 2nd, 2010 | Author: admin | Filed under: Program | 评论关闭

http://support.microsoft.com/kb/977998

How to create and manipulate Microsoft Excel by using Office Automation in Visual C++, Visual C# and Visual Basic.NET


Well-known SIDs

Posted: 十一月 23rd, 2009 | Author: admin | Filed under: Program | 评论关闭

http://msdn.microsoft.com/en-us/library/aa379649(VS.85).aspx


制定合理的软件测试流程

Posted: 十月 9th, 2009 | Author: admin | Filed under: Program | 评论关闭

首先向大家介绍一下我理解的测试流程是什么,流程在词典上的解释是“工艺程序,从原料到制成品的各项工序安排的程序”,那测试流程就是指从软件测试开始到软件测试结束经过的一系列准备、执行、分析的过程。所以我认为测试流程并不是只存在于有完整测试团队的公司,它分布在每一个对软件执行测试的公司中,哪怕这个公司只有一个测试人员。

软件测试想要在一个公司中从无到有进而逐步完善,也需要公司上层领导、开发人员等人从接受到理解、支持到尊重的一个过程。要想完成这个目标并不容易,需要公司外部整个软件测试行业和公司内部软件测试工作的双重影响。而整个软件测试行业实际上又是由各个公司内部的软件测试团体组成的,归根结底要让大家都接受软件测试还是要靠每个公司内部软件测试工作的影响。只有合适的测试流程才能快速的显示出测试工作的作用,才能让大家更快的接受测试工作,主动配合测试工作,进而完善测试工作,达到良性循环的作用。

制定合理的测试流程需要考虑的因素很多,毕竟它是大家进行测试工作的依据,又需要理清和需求人员、开发人员、市场人员等多方人员的关系,而且公司不同侧重点又有所不同,所以在这里不可能面面俱到列出所有因素,只是根据自己的经验列出认为比较重要的几点。

制定测试流程首先要清楚自己所在的公司正处在什么发展阶段,是处在最初的创业期还是已经度过了创业期希望通过测试来提高产品质量,以便取得更多的业务创造更大的效益。可能有的同行会觉得奇怪,我们软件测试是做技术的只管做好本职工作,为什么制定流程时要这么重视公司的发展情况呢。其实公司的情况和制定测试流程有非常大的联系,公司的情况直接决定着公司对产品的要求,而测试部门一般来说是产品投入市场的最后一个关口,这也就等于公司的发展情况决定了公司对测试部门的要求。开发软件前要先了解软件的需求,制定测试流程前当然也要了解清楚公司对测试部门的需求。了解了公司的情况和要求后,就要根据这些要求结合制定者的测试知识和经验,制定即符合公司要求又能起到软件测试目的的软件测试流程。当然这样做并不是说让软件测试向公司的一些不利于开展软件测试工作的现实情况妥协,只是根据公司的实际情况制定一些可以马上改变公司测试工作现状的流程。

一般正在创业期的公司面临的是公司生存的问题,它需要和其他公司抢市场,这时公司为了配合市场的要求不光要求软件产品的质量更要求整个项目的进度,但是对一些在软件测试过程需要的文档和产生的文档却不是特别在意。而且这样的公司开发人员往往都是测试人员8倍10倍,经常是软件代码已经快写完了,测试人员才会进入项目。这样我们在制定测试流程时就要注意软件测试工作的重点是执行测试,虽然前期的一些测试准备对以后的执行测试工作有很大的指导性作用,但前期准备工作如测试用例的写作等也会增加软件测试的时间,尤其是软件测试人员在软件已经开发出来才进入项目的时候,如果还要花大量时间去准备软件测试,更会让不了解软件测试的人误认为是软件测试拖延了整个项目的进度,让软件测试的推广工作受到更多的阻碍。这样我们就可以适当删减一些前期的准备工作,如减去用例评审工作,减少一些测试文档的写作工作,对一些测试文档的写作要求适当放宽等,更具体的就是我们可以不要求测试用例将操作步骤描述的很详细,但是要记录测试的思路可以简化为测试方案,达到对测试工作的跟踪目的就可以。但测试用例最好不要省略因为这个文档可以为以后再测试类似功能的产品做好经验的积累。

如果公司已经度过最初的生存期,这时公司会对产品的质量有更高的要求并且体现到对软件开发过程的要求。而且公司从软件开发计划制定、进度跟踪、项目管理等都有了一定的经验也有了一些历史数据可以参考。这样对软件测试的一些前期准备工作也会有所考虑,并适当满足,这时软件测试流程可以加强前期测试准备工作、后期测试分析工作。具体可以要求软件测试从需求介入以便尽早了解产品,制定独立的软件测试计划并将软件测试时间纳入整个项目进度中,细化测试用例写作的力度,增加后期对缺陷分析的工作进而逐步提高整个软件测试团队的技术力量,让软件测试渗透到整个软件过程中。

其实公司内软件测试一片空白或者测试流程比较完善的公司流程制定和执行相对来说都会比较容易一些,如果是一片空白你可以完全按照自己的想法去建立软件测试流程,剩下的困难只是如何去说服领导和开发配合这个流程。如果软件测试流程已经比较完善,大家对软件测试已经有了一定的支持和理解并且现阶段运行良好,你只需要在一些小节上进行一些修改,如果的确有利于工作会得到大多数人的支持。最难制定的是软件测试刚刚起步有了一些不成型的测试流程,也许不太符合你的想法也许不太适合公司的实际情况但的确在公司运行了一段时间,如果想改变不光要说服测试部门以外的人还要说服测试工作人员,增加了工作的难度,如果公司是这种情况请大家在制定软件测试流程前更要慎重考虑,详细了解公司的情况。

制定软件测试流程时可以参照一些比较完善的软件测试流程,但切忌不可照搬这些流程。我们经常会遇到这样的情况,如果在测试工作过程中碰到一些问题有人会说如果在微软或IBM公司是这样处理的,我们也可以这样。但是我们的工作环境和这些公司是不一样的,测试的思想已经深入贯穿到他们开发的每一个步骤中,而我们目前大多数公司的软件开发过程并没有达到这样的程度,我们大多需要解决的是在测试思想还没有贯彻彻底的公司我们怎么处理这个问题。无论是软件测试刚刚起步还是已经有了一定软件测试团队规模有多年软件测试经验的公司,都有一些属于自己公司特定的测试方法和流程,就是完善的软件测试流程也各有各的不同,IBM和微软在测试流程肯定是有所差别的。如果将他们的流程照搬过来,没有给公司同事一个慢慢接受消化的过程,很容易适得其反甚至引起公司同事的抵触情绪。这里并不是说这些测试流程不好,只是这些测试流程也不是一开始就建立起来的,而是通过多年的经验和教训逐步完善一步一步慢慢建立的,并且现在它们仍在进一步完善中。我们不仅要学习这些完善的软件测试流程是什么样的,我们更要学习为什么制定这套软件测试流程。给人金子不如给人点金术,也就是这个道理。那些软件测试流程比较完善的公司走在了我们的前面,我们就要学习他们这一路走来的经验和教训,避免走他们走过的弯路,缩短完善公司流程的时间。

制定软件测试流程要明确测试部门的职责。经常会有测试人员抱怨自己在公司里就是一个打杂的,什么工作都要做,其实这就是职责不明确引起的问题,这样会很大程度打击测试人员的工作积极性影响工作情况进而影响大家对软件测试工作的看法。一些如写用户手册、给用户培训等工作在公司里如果没有专门的部门来做,就很容易推给软件测试人员来做,但是都没有明文规定而且在对软件测试人员进行工作考核时又很容易疏忽这些工作,而且这些工作有时候看起来不太起眼,但是需要耗费大量的时间。所以我们要明确制定软件测试部门的职责、软件测试人员担任的工作内容,其他一些工作如果由测试人员来做,就要在制定软件测试计划中明确写出这些工作需要的时间,以防止这些工作占用测试时间,使测试人员陷于被动之中。

制定软件测试流程不光要制定软件测试部门内部的工作流程,更要制定与开发部门、需求部门等外部部门的接口工作的流程,一旦项目在进度、功能上有了变化要及时和测试部门沟通,不要让测试部门成为最后一个知情人。

另外在具体执行测试流程时要注意执行的效果,将测试工作落实到实处,而不是为了走过场证明测试工作已经达到了某种程度,否则再好再适合的流程也不能起到它的作用。例如大家都一致认为测试应该从需求开始介入,但是从需求开始介入并不是测试人员参与了需求评审会议提出一些问题就达到了目的。而是要求测试人员在开发把产品开发出来前就要了解这个产品都要实现什么功能,虽然不知道开发怎么去实现这些功能,但是要知道实现了哪些功能。因为在产品在开发提交测试之后往往由于产品一些基本功能没有实现,使测试人员很难深入的对产品进行业务流程的测试,所以一些重大的流程问题往往在测试的后期发现,但是这时可能离产品提交用户的时间很近了,开发人员修改这个问题很可能会引发其他的问题增加产品的风险,而且一些开发还会抱怨为什么测试不早发现这些问题,还有可能使公司怀疑测试人员的能力,让测试工作的开展受到一定的阻碍。只有越来越熟悉产品才会发现越来越深入的问题,这是一般的发展规律我们难以改变。但是如果我们前期对产品需要实现的功能有很深的了解,前期就可以提前设计一些业务流程上的问题,一旦产品基本功能可以完成就马上进行业务流程的测试,使这个过程大大缩短。

制定合理的软件测试流程是一门很深的学问,它需要制定者有丰富的软件测试理论知识,软件测试执行经验、管理经验以及沟通能力等等多方面的经验能力,还需要许多测试人员经过长时间的实践来验证完善,仅希望此文对大家有所启发。


vb6controls.reg内容

Posted: 三月 15th, 2009 | Author: admin | Filed under: Program | Tags: , | 评论关闭

REGEDIT
HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights.

// Masked Edit Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\BC96F860-9928-11cf-8AFA-00AA00C00905 = mmimfflflmqmlfffrlnmofhfkgrlmmfmqkqj

// Chart Control 6.0 (OLEDB) license key
HKEY_CLASSES_ROOT\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1 = aadhgafabafajhchnbchehfambfbbachmfmb

// Common Dialog Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905 = gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj

// ADO Data Control 6.0 (OLEDB) license key
HKEY_CLASSES_ROOT\Licenses\C4145310-469C-11d1-B182-00A0C922E820 = konhqhioohihphkouimonhqhvnwiqhhhnjti

// Common Controls-3 6.0 license key
HKEY_CLASSES_ROOT\Licenses\38911DA0-E448-11D0-84A3-00DD01104159 = mcpckchcdchjcjcclidcgcgchdqdcjhcojpd

// Windows Common Controls-2 5.0 (SP2) license key
HKEY_CLASSES_ROOT\Licenses\9E799BF1-8817-11cf-958F-0020AFC28C3B = uqpqnqkjujkjjjjqwktjrjkjtkupsjnjtoun

// Windows Common Controls license key
HKEY_CLASSES_ROOT\Licenses\57CBF9E0-6AA7-11cf-8ADB-00AA00C00905 = aahakhchghkhfhaamghhbhbhkbpgfhahlfle

// Data Bound Grid Control 5.0(SP3) license key
HKEY_CLASSES_ROOT\Licenses\556C75F1-EFBC-11CF-B9F3-00A0247033C4 = xybiedobrqsprbijaegcbislrsiucfjdhisl

// Data Bound List Controls 6.0 license key
HKEY_CLASSES_ROOT\Licenses\096EFC40-6ABF-11cf-850C-08002B30345D = knsgigmnmngnmnigthmgpninrmumhgkgrlrk

// Internet Transfer Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\78E1BDD1-9941-11cf-9756-00AA00C00908 = yjrjvqkjlqqjnqkjvprqsjnjvkuknjpjtoun

// Multimedia Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\B1EFCCF0-6AC1-11cf-8ADB-00AA00C00905 = qqkjvqpqmqjjpqjjvpqqkqmqvkypoqjquoun

// Chart Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8 = whmhmhohmhiorhkouimhihihwiwinhlosmsl

// Windows Common Controls-2 6.0 license key
HKEY_CLASSES_ROOT\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D = iplpwpnippopupiivjrioppisjsjlpiiokuj

// Windows Common Controls 6.0 license key
HKEY_CLASSES_ROOT\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1 = knlggnmntgggrninthpgmnngrhqhnnjnslsh

// Comm Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905 = kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun

// DataGrid Control 6.0 (OLEDB) license key
HKEY_CLASSES_ROOT\Licenses\CDE57A55-8B86-11D0-b3C6-00A0C90AEA82 = ekpkhddkjkekpdjkqemkfkldoeoefkfdjfqe

// DataList Control 6.0 (OLEDB) license key
HKEY_CLASSES_ROOT\Licenses\A133F000-CCB0-11d0-A316-00AA00688B10 = cibbcimbpihbbbbbnhdbeidiocmcbbdbgdoc

// DBWin license key
HKEY_CLASSES_ROOT\Licenses\D015B071-D2ED-11d0-A31A-00AA00688B10 = gjdcfjpcmjicjcdcoihcechjlioiccechepd

// MSDBRPT license key
HKEY_CLASSES_ROOT\Licenses\9DF1A470-BA8E-11D0-849C-00A0C90DC8A9 = cchcqjejhcgcqcfjpdfcdjkckiqikchcojpd

// FlexGrid Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\72E67120-5959-11cf-91F6-C2863C385E30 = ibcbbbebqbdbciebmcobmbhifcmciibblgmf

// MAPI Controls 6.0 license key
HKEY_CLASSES_ROOT\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905 = wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun

// MSRDO 2.0 license key
HKEY_CLASSES_ROOT\Licenses\B1692F60-23B0-11D0-8E95-00A0C90F26F8 = mjjjccncgjijrcfjpdfjfcejpdkdkcgjojpd

// RemoteData Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\43478d75-78e0-11cf-8e78-00a0d100038e = imshohohphlmnhimuinmphmmuiminhlmsmsl

// Windowless Controls 6.0 license key
HKEY_CLASSES_ROOT\Licenses\80E80EF0-DBBE-11D0-BCE2-00A0C90DCA10 = qijimitpmpnpxplpvjnikpkpqoxjmpkpoivj

// PictureClip Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\6FB38640-6AC7-11cf-8ADB-00AA00C00905 = gdjkokgdldikhdddpjkkekgknesjikdkoioh

// Rich TextBox Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\DC4D7920-6AC8-11cf-8ADB-00AA00C00905 = iokouhloohrojhhhtnooiokomiwnmohosmsl

// Sheridan Tab Control license key
HKEY_CLASSES_ROOT\Licenses\190B7910-992A-11cf-8AFA-00AA00C00905 = gclclcejjcmjdcccoikjlcecoioijjcjnhng

// SysInfo Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\E32E2733-1BC5-11d0-B8C3-00A0C90DCA10 = kmhfimlflmmfpffmsgfmhmimngtghmoflhsg

// Winsock Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d = mlrljgrlhltlngjlthrligklpkrhllglqlrk


sql 时间函数

Posted: 三月 8th, 2009 | Author: admin | Filed under: Program | Tags: , | 评论关闭

1. 当前系统日期、时间
select getdate()
2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,’2004-10-15′) –返回:2004-10-17 00:00:00.000

3. datediff 返回跨两个指定日期的日期和时间边界数。
select datediff(day,’2004-09-01′,’2004-09-18′) –返回:17

4. datepart 返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(month, ’2004-10-15′) –返回 10

5. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, ’2004-10-15′) –返回:星期五

6. day(), month(),year() –可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120)
,当前时间=convert(varchar(8),getdate(),114)

select datename(dw,’2004-10-15′)

select 本年第多少周=datename(week,’2004-10-15′)
,今天是周几=datename(weekday,’2004-10-15′)

函数 参数/功能
GetDate( ) 返回系统目前的日期与时间
DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期
DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值
DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称

参数 interval的设定值如下:

值 缩 写(Sql Server) Access 和 ASP 说明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q 季 1 ~ 4
Month Mm m 月1 ~ 12
Day of year Dy y 一年的日数,一年中的第几日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日数,一周中的第几日 1-7
Week Wk ww 周,一年中的第几周 0 ~ 51
Hour Hh h 时0 ~ 23
Minute Mi n 分钟0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms – 毫秒 0 ~ 999

Read the rest of this entry »


计算对话框编辑器的单位尺寸与象素的关系

Posted: 三月 5th, 2009 | Author: admin | Filed under: Program | Tags: , , , | 评论关闭

最近用CButtonST经常出现按钮下面出现1像素的斑点的问题,按钮大小不是根据按钮图片大小计算出来的,而是根据VC对话框编辑器的DLU的大小拖出来的…

解决办法如下:

http://support.microsoft.com/default.aspx?scid=kb;en-us;145994

How to calculate dialog box units based on the current font in Visual C++

我对话框用的Verdana 9号字, 根据这篇文章算出来
baseUnitX = 8
baseUnitY = 14

再根据
pixelX = (dialogunitX * baseunitX) / 4
pixelY = (dialogunitY * baseunitY) / 8
得出按钮图片像素宽度满足必须是2的倍数,高度必须是14的倍数,才能在VC的对话框编辑器里调出来合适的按钮大小…


如何获得某个时间是一年中的第几天?

Posted: 三月 3rd, 2009 | Author: admin | Filed under: Program | 评论关闭

对time进行format时候有2个格式化参数(formatting codes):

%U

Week of year as decimal number, with Sunday as first day of week (00 – 53)

%W

Week of year as decimal number, with Monday as first day of week (00 – 53)


MSCHART全部属性方法介绍

Posted: 二月 23rd, 2009 | Author: admin | Filed under: Program | 评论关闭


void CMoreDMcode::OnCacluteDelta(int nRow)
{
m_Chart.SetRedraw(false);
m_Chart.SetRow(1);
for(int i=1;i< =64;i++)
{
m_Chart.GetDataGrid().SetData(i,1,nDelta[i-1],0);
}
CRgn rgn;
m_Chart.GetUpdateRgn(&rgn);

m_Chart.SetRedraw(true);
m_Chart.InvalidateRgn(&rgn,false) ;
}

void CMoreDMcode::InitChart()
{
VARIANT var;

m_Chart.SetColumnCount(1); //设置曲线条数
m_Chart.SetRowCount(64); //一条曲线有64个点
m_Chart.SetTitleText("二位形态码△t变化趋势";
m_Chart.SetChartType(1|2);//
//m_Chart.SetShowLegend(TRUE);

//设置X轴
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(8);// 每四刻度一个标注
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(8); // 每刻度一个刻度线

//m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMaximum(64); // X轴最大刻度
m_Chart.GetPlot().GetAxis(0,var).GetValueScale().SetMinimum(0); // X轴最小刻度
m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("二位形态码";

//设置Y轴
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(10); // Y轴刻度10等分
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
//m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("△t变化趋势"; // Y轴名称
//m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().GetTextLayout().SetOrientation(2);//Y轴名称排列方式

m_Chart.GetPlot().SetUniformAxis(FALSE);

}

void CMoreDMcode::OnMSChartDraw()
{

CString str;
int nRow = m_Grid.GetFocusCell().row;
if (nRow<0)
{
MessageBox("请在左表选择要排序的行!","操作错误",MB_OK|MB_ICONWARNING);
return;
}

for(int i=0;i<64;i++)
{
str = m_Grid.GetItemText(nRow,i+3);
nDelta = atoi(str.GetBuffer(0));
}

InitChart();//初始化坐标轴

// 根据不同的数据设定不同的Y轴最大刻度
int m = GetMaxData(nDelta);
m=(m/50)*50+50;//取靠近M的比M大的50的倍数
str = m_Grid.GetItemText(nRow,0);
VARIANT var;
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(m);

OnCacluteDelta(nRow);//绘图
str = "当前绘制的是第"+str+"期的△t变化趋势";
m_Tip.SetWindowText(str);
}

函数名字取得不好,大家见笑了,开始取名字错误,后来不想该了,呵呵^_^

Read the rest of this entry »


ActiveX内调用网页Java script ~~

Posted: 二月 22nd, 2009 | Author: admin | Filed under: Program | 评论关闭

基本步骤在http://www.pin5i.com/showtopic-21811.html~~

ActiveX中调用Java script      第一种方式是使用事件,这是最简单方法。在“类视图”中,右键CMyActiveXCtrl ,选择“添加事件”,这种方式就不赘述了。

 

      第二种方式是利用IWebBrowser2和IHTMLDocument2这两个COM组件来访问包含ActiveX控件的外部Web页面上的所有元素。具体实现步骤如下:

1, 在CMyActiveXCtrl类中加入两个变量:

public:
    IWebBrowser2* pWebBrowser; //IE浏览器
    IHTMLDocument2* pHTMLDocument; //包含此控件的web页面
2,重载OnSetClientSite函数。

void CMyActiveXCtrl::OnSetClientSite()
{
    HRESULT hr = S_OK;
    IServiceProvider *isp, *isp2 = NULL;
    if (!m_pClientSite)
    {
        COMRELEASE(pWebBrowser);
    } 
    else
    {
        hr = m_pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));
        if (FAILED(hr))
        {
            hr = S_OK;
            goto cleanup;
        }
        hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
        if (FAILED(hr))
        {
            hr = S_OK;
            goto cleanup;
        }
        hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&pWebBrowser)); //查询IE浏览器接口
        if (FAILED(hr))
        {
            hr = S_OK;
            goto cleanup;
        }
        hr  =  pWebBrowser->get_Document((IDispatch**)&pHTMLDocument); //查询Web页面接口 
        if(FAILED(hr)) 
        { 
            hr = S_OK;
            goto cleanup;
        } 
    cleanup:
        // Free resources.
        COMRELEASE(isp);
        COMRELEASE(isp2);
    }
}

Read the rest of this entry »


代码书写规范(Java)

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭

前几天整理出来的一个JAVA的代码书写规范!

代码书写规范
一、目的   

  对于代码,首要要求是它必须正确,能够按照程序员的真实思想去运行;第二个的要求是代码必须清晰易懂,使别的程序员能够容易理解代码所进行的实际工作。在软件工程领域,源程序的风格统一标志着可维护性、可读性,是软件项目的一个重要组成部分。而目前还没有成文的编码风格文档,以致于很多时候,程序员没有一个共同的标准可以遵守,编码风格各异,程序可维护性差、可读性也很差。通过建立代码编写规范,形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性、可继承性和一致性,可以保证程序代码的质量,继承软件开发成果,充分利用资源,使开发人员之间的工作成果可以共享。

    本文在参考业界已有的编码风格的基础上,描述了一个基于 JBuilder 的项目风格,力求一种统一的编程风格,并从整体编码风格、代码文件风格、函数编写风格、变量风格、注释风格等几个方面进行阐述。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)
二、整体编码风格

1、缩进

    缩进建议以4个空格为单位。建议在 Tools/Editor Options 中设置 Editor 页面的Block ident为4,Tab Size 为8。预处理语句、全局数据、标题、附加说明、函数说明、标号等均顶格书写。语句块的”{“、”}”配对对齐,并与其前一行对齐,语句块类的语句缩进建议每个”{“、”}”单独占一行,便于匹对。JBuilder 中的默认方式是开始的”{“不是单独一行,建议更改成上述格式(在 Project/Default Project Properties 中设置 Code Style 中选择 Braces 为 Next line)。

Read the rest of this entry »


APIHOOK实例剖析

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭

关于APIHOOK的基础知识有很多,如dll的相关知识、Hook的相关知识、系统进程与线程之间的联系等。具体可以看我的另两篇文章:”我的Dll(动态链接库)学习笔记” 和 “我的Hook学习笔记“。:)下面进入这篇文章的重点,根据APIHook源码进行APIHook的剖析。
 
一、APIHOOK之dll部分
 
//////////////////////////////// APIHook_Dll.cpp ////////////////////////////////////////
//                             rivershan写于2002.9.23                                  //
/////////////////////////////////////////////////////////////////////////////////////////

#include “stdafx.h”
#include “APIHook_Dll.h”

#include <ImageHlp.h>
#include <tlhelp32.h>

#pragma comment(lib,”ImageHlp”) //定义全局共享数据段

#pragma data_seg(“Shared”)
HMODULE hmodDll=NULL;
HHOOK hHook=NULL;

#pragma data_seg()

#pragma comment(linker,”/Section:Shared,rws”) //设置全局共享数据段的属性

Read the rest of this entry »


我的Hook学习笔记

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭

一、基本概念:

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

    钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

二、运行机制:

1、钩子链表和钩子子程:

    每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

 Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

    钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

    钩子子程必须按照以下的语法:
    LRESULT CALLBACK HookProc
 (
   int nCode,
      WPARAM wParam,
      LPARAM lParam
     );
HookProc是应用程序定义的名字。

nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。

Read the rest of this entry »


我的Dll(动态链接库)学习笔记

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭

    比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。

    Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Windows自己就将一些主要的系统功能以DLL模块的形式实现。

    一般来说,DLL是一种磁盘文件,以.DLL、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。

    在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。Windows操作系统对DLL的操作仅仅是把DLL映射到需要它的进程的虚拟地址空间里去。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有.       

一、关于调用方式:

1、静态调用方式:由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(如还有其它程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它),简单实用,但不够灵活,只能满足一般要求。

Read the rest of this entry »


在VC中使用Automation操纵Word和Excel

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭

最近要在程序中添加一个将程序中的图片和数据输出到Word的功能并且需要将数据导出到Excel,以前从来没弄过,遂首先祭起在CSDNVC/MFC论坛搜索的法宝。输入关键字Word得到n篇帖子,一一看过之后得知有两种方法可以做我所需要的事情,一种是使用Office自带的类型库的方法,另一种是直接使用COMAutomation技术。两种方法比较之后,由于使用类型库所需要导入的类太多,并且对于不同的Office版本的兼容性问题不好掌握,因此在我的程序中使用了COMAutomation技术进行操作。方法决定了,接下来是具体的编码咯。

 

先来实现将数据导出到Word,参考MSDN中的Q238393得到了一个AutoWrap函数,这是最有用的。然后参考Q220911得到了对Word的操作的方法,如画表格、输入文字、分行等,但是Q220911中提供的是使用类型库的方法(其实二者是大同小异,如果你跟踪进入到MSWord.h里面去的话,你会发现MSWord.h里面使用的就是AutomationInvoke函数来调用各个属性或者方法的分发ID来实现功能的,不过是封装了起来而已),因此打开VC自带的工具OLEViewerOffice自带的VBA中文帮助,并且还用到了MSDN中的Q216388提供的B2CSE.exe来将VBA转化到C++代码。经过几个工作日的努力终于达到了我所要求的效果。

 

再来实现将数据导出到Excel的功能,这个要求比较简单。基本方法同上,也是使用了AutoWrap。对Excel的操作参考了Q216686,使用SafeArray来对Excel进行填充。很快也就达到了要求。

 

总结完了,不知大家能从这篇文章中得到什么呢?


Windows可执行文件简述(三)

Posted: 二月 16th, 2009 | Author: admin | Filed under: Program | 评论关闭
4LE格式

Windows3.x的时代,从DOS启动WindowsWindows在把机器转到保护模式之前需要在实模式下做一些初始化。实模式的16位代码必须和32位代码一起放在可执行文件中。旧的DOS下的可执行文件和NE格式的可执行文件无法满足这个要求,于是从Win 3.x起到Win 9x,产生了一种新型的可执行文件格式LE,它只适用于工作于系统底层的、同时包含16位代码和32位代码的VxD驱动程序。OS/2 2.x也使用LE格式。

 

一般而言,保护模式下的可执行文件会在不同的Sections中放置程序代码和数据,利用可执行文件头中的各种属性标志来告诉可执行文件加载器在面对这些Sections时的各种细节动作。但是VxD却将程序代码和数据混杂在段之中,通过不同段前的标识来表明该段在运行时的特性。程序代码和数据之所以能够混杂在一起,而仍然能够有效运作,是因为VxD所使用的平坦模式的代码和平坦模式下的数据选择器有相同的基地址与限制因素。因此不论使用上述哪一个寄存器缓存器都可以取用程序代码或数据。

 

下图是LE格式的可执行文件的结构示意图:

 

MZ文件头

DOS文件头

DOS Stub程序

LE标志

LE文件头

LE文件头

LCODE

程序段

PCODE

…… ……

16ICODE

MCODE

 

Read the rest of this entry »