博文

 打包程序入门图解(2007-11-16 20:16:00)

摘要:本篇文档会告诉你如何使用InstallShield开发平台来创建,编译,运行一个安装程序。在这篇文档中你会学习到安装过程中碰到的下面一些内容:加载安装文件,设置快捷方式,修改注册表,条件安装一些文件,注册com组件,更换安装界面,调试以及发布安装程序。   创建,编译,测试安装的工程   这一部分主要讲述如何快速的创建一个安装Project。   1、创建一个安装的工程   首先来看看InstallShield8.0的开发控制台界面,熟悉一下开发环境。
图1
  我们可以从文件菜单中选择开始一个新的工程向导,或者可以直接从工具栏中选中开始一个新的工程向导按钮,更直接的就是单击控制台界面上的Start the Project Wizard超链接即可弹出一个创建新工程的对话框如图2,你可以安装提示一步一步地往下走就是了。


图2
  单击下一步,给我们的工程设置名称,见图3


图3
  在上图中,当你输入一个工程的名字并单击下一步的时候,向导就会创建一个ProjectName.ism,被例子中则创建了 liqiang_test.ism文件,你在IDE中对工程所做的设置都保存在这个文件中,如果你想将你的工程移植到其他机器上,你只需要将.ism文件复制到其他机器上即可。

  单击下一步,选择安装工程的类型,见图4


图4
  这个属性页允许你选择创建工程的类型,这里我们选择了InstallScript MSI Project,这种类型的安装程序使用脚本来驱动安装界面,使用windows installer来改变目标系统,比如添加文件,创建快捷方式,修改注册表,关于InstallScript MSI Project和Basic MSI Project两种方式详细的区别,你可以参考帮助文件。 单击下一步,设置应用程序的信息,图5


图5
  你在Application Name中填写的应用程序的名称会出现在安装对话框中,并且你在控制面板的添加和删除程序对话框中显示的名称也就是这个名......

阅读全文(3335) | 评论:0

华为面试题(2007-09-09 15:01:00)

摘要:、局部变量能否和全局变量重名?   答:能,局部会屏蔽全局。要用全局变量,需要使用"::"   局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。   2、如何引用一个已经定义过的全局变量?   答:extern   可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。   3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?   答:可以,在不同的C文件中以static形式来声明同名全局变量。   可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错   4、语句for( ;1 ;)有什么问题?它是什么意思?   答:和while(1)相同。   5、do……while和while……do有什么区别?   答:前一个循环一遍再判断,后一个判断以后再循环   6、请写出下列代码的输出内容   #include<stdio.h>
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10*a++;
   printf("b,c,d:%d,%d,%d",b,c,d);
   return 0;
  }   答:10,12,120   7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?   全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件......

阅读全文(1997) | 评论:2

微软亚洲技术中心面试题(2007-09-09 14:57:00)

摘要:.进程和线程的差别。   线程是指进程内的一个执行单元,也是进程内的可调度实体.   与进程的区别:   (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
  (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
  (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
 
  2.测试方法   人工测试:个人复查、抽查和会审
  机器测试:黑盒测试和白盒测试   2.Heap与stack的差别。   Heap是堆,stack是栈。
  Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
  Stack空间有限,Heap是很大的自由存储区
  C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
  程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。   3.Windows下的内存是如何管理的?   4.介绍.Net和.Net的安全性。   5.客户端如何访问.Net组件实现Web Service?   6.C/C++编译器中虚表是如何完成的?   7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。   8.谈谈IA32下的分页机制   小页(4K)两级分页模式,大页(4M)一级   9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?   一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方   10.在IA32中一共有多少种办法从用户态跳到内核态?   通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等   11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?   用内存映射或全局原子(互斥变量)、查找窗口句柄..
  FindWindow,互斥,写标志到文件或注册表,共享内存。.     12.如何截取键盘的响应,让所有的‘a’变成‘b’?  ......

阅读全文(198) | 评论:0

c、c++面试题剖析(2007-09-09 14:55:00)

摘要:本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。

  许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。

  分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。

  2.找错题

  试题1:

void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
  试题2:

void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
  str1[i] = 'a';
 }
 strcpy( string, str1 );
}
  试题3:

void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
}
  解答:

  试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;

  对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到strin......

阅读全文(205) | 评论:0

六大方法做优秀程序员(2007-07-26 23:01:00)

摘要:本文原作者结合自身经历,总结以下六种方法,可以帮助我们成为一名更好的开发者。 1.       交谈 尽可能多地跟其他软件开发者交谈;培养个人关系;跟意见与你相左的人交流;跟经验更丰富的人交流;跟阅历丰富的人交流。多到Groups 中去,尤其是交谈自由随意的Groups——不约束主题,不约束交谈内容。 2.       选择更好的环境 我遇到好多开发者,在我看来他们有成为优秀开发者的所有优点,只是他们没有机会在好的环境中工作。这里所说的好的环境,是指周围有一帮愿意且能够分享他们知识的开发者。如果你是“菜鸟级”开发者,你的成长路线将因他们而大为缩短;如果你是“高级”开发者,你的能力也会因为同伴的刺激和挑战而提高。 我之前就是在一个非常糟糕的小店打工,钱挣得不少,却是无法提升能力的地方。后来我冒险般地决定去了一家咨询公司,在那里我遇到了很多优秀的开发者。虽然这次换工作给我的家庭和个人来说并没有多大好处,但它给我的职业生涯带来了巨大的发展动力。 3.       参与开源 也许你的工作会枯燥,甚至不合你的兴趣,你也从未从你的开发中得到乐趣。那么,你该参与一个开源项目了。 你可以选择你感兴趣的项目和技术,选择能促使你提高开发技能、让你尝试全新开发思路的项目,而且更为可贵的是,很多都是免费的。搞不好,还能赚点外快呢。 4.       写博客 我曾不止一次地告诉我的妻子,我职业道路上一直在做的唯一一件明智的事情就是写博客。写博客,尤其是观点争论性质的博客,会帮助你整理最近一段时间的思考,没有什么比自己表达自己更引发思考的了,尤其是当有成百上千人读你博客的时候。 5.       多浏览 博客圈中有丰富的资源,自由而免费。除了自己写,多浏览甚至留言跟他们争论都是提高自己很好的方法。 6.       扩大阅读面 保持RSS订阅的平衡性。以前我订阅的技术类几乎全是敏捷开发的,但是最近我扩大了阅读面......

阅读全文(2763) | 评论:0

程序员更喜欢Firefox 市场份额超过IE两倍(2007-07-26 22:48:00)

摘要:【CSDN独家报道】浏览器市场激烈的血战从来就没有停止过,虽然微软一直声称IE占据全球浏览器市场份额的78%,但是,根据最近在CSDN的一份调查报告中显示,使用Firefox的人数比例已经远远超过了IE7.0,参与这次调查的人数截止到今天达到了1710人,其中38.62%的人使用FireFox、34.98%的人使用Maxthon、15.29%的人使用IE7.0、6.88%的人使用Opera、4.12%的人使用腾讯的TT。





如图所示:



比例图:



虽然这次参与调查的多数是软件开发人员或者多数是IT从业人员,但是从这一比例我们不难看出,IE丢失掉了曾经在浏览器大战中占据了的技术优势,在IE6推出后的5年时间里,浏览器一直在快速发展,而IE却一直没有更新过,这对一个世界上最常用的产品来说绝对是致命的。Firefox以它的小巧、安全,很容易扩展和定制的特长获得了越来越多的喜爱。

更重要的是,它是是一个自由的浏览器,所有的源代码都是开放的,任何人可以为它的成长贡献力量。Cookie、页面缓存,个人都可以精确的控制,这些特性都是技术人员们所崇尚的“我的地盘 我做主”的精神。

为此,我们也专门采访了国内某著名技术门户网站的技术人员小武,他对于FireFox的喜爱程度溢于言表,相对于IE来说,他认为FireFox是“相当的好用”,比如FireFox可以只显示网页中的某一部分代码,又比如FireFox里面的“捉虫”工具很好用,而且FireFox小巧精悍,对CSS和脚本的支持也非常得人心。

不过我们采访的另一位网站架构师却认为,如果说之前FireFox相对IE6有50%的优势的话,那么,FireFox相对于现在的IE7的优势已经降低到25%左右了。因为IE7从底层已经做了很多的修改,已经慢慢的向W3C标准靠近了许多,在功能使用方面与FireFox的差距也变得很细微,Tab功能,CSS和脚本支持功能现在IE7都比之前表现强了,差距仅仅存在于某些小细节中了。

IE6在这个市场中存在了5年之后微软才意识到改变和向国际标准靠拢的重要性,这就直接导致了像小武这样的大量的技术人员失去了对IE的信心,投向FireFox阵营,不过,微软到底还是......

阅读全文(2456) | 评论:2

高效程序员应该养成的七个习惯 (转)(2007-05-27 21:12:00)

摘要:于软件工程师来说,工作也许意味着许多东西 -- 稳定的收入、做自己感兴趣的项目、找一份更好工作的跳板,或者你只是喜欢与其他程序员共事。但说到“效率”,强调的是在一定时间内按质完成项目的能力。Phil Chu根据自己的经验提出了高效程序员应该养成的七个习惯。 1.理解你的需求
成为一个有效率的程序员首先要知道如何正确的支配自己的时间。对时间最大的浪费莫过于去做那些没有用处或者永远不会上线的项目。而导致这种结果的根源往往是对需求理解的偏差。
要最大程度避免这种情况的发生,最好的办法是快速建模,尽可能让演示系统早点出来。对于客户来说,只有看得到摸得着的产品摆在面前,他们才会有兴趣去试用观察,才会在实际的操作中发现供需双方在需求理解上的偏差。否则即使你写上几百页的需求分析文档也只能是自己的一面之词,客户可没耐心去检查这些文档写的是否准确。
另一方面,你应该让每一个阶段的开发成果都能够尽早的提交给客户。让他们以完全不考虑操作合理性和业务逻辑性的傻瓜级操作来发现程序员编程中的固有思维局限。尤其必须让QA尽早的介入到项目开发中来。如果能够每天提交一份测试版本给QA自然是最理想的了,但大多数项目开发做不到这样的粒度,那么就争取每周提交一份可测试版本。重要的是应该让QA和开发能够保持交错并行状态。只有这样,才能让QA尽早发现bug,降低每个bug的修复成本,同时缩减独立测试周期的跨度。
程序员往往不愿意把半成品代码交付给测试人员,相反他们更喜欢在所有代码都完工,达到自己满意的程度之后再让别人来测试。因为在这之前的代码往往存在很多程序员自己知道需要修改(或者故意留待后续补全)的流程缺失和Bug,测试人员并不知道哪些是真正的Bug,哪些只是临时性的运行错误,每次都会一股脑儿作为Bug反馈给程序员。这往往让程序员们心烦。同时测试人员有时候也不喜欢测试这种很多分支都走不通的中间版本。
但不管喜不喜欢,测试并发现问题是测试人员的工作;程序员则应该认识到,Bug反馈得越早就越是件好事情。QA和开发之间的关系往往很敌对,可实际上双方的目标是一致的。“忠言逆耳”古训有之,对于程序员来说就应该“有则改之,无则加勉”。总好过项目完成之后才发现一堆的问题,到那时候再要做修改,基本上都会牵一发而动全身,痛苦的还是程序员自己。
2.保持真实性
尽可能让你的系......

阅读全文(2333) | 评论:0

七种QSORT排序方法(2007-05-27 21:04:00)

摘要:本文中排序都是采用的从小到大排序>   一、对int类型数组排序   int num[100];   Sample:   int cmp ( const void *a , const void *b) { return *(int *)a - *(int *)b; }   qsort(num,100,sizeof(num[0]),cmp);   二、对char类型数组排序(同int类型)   char word[100];   Sample:   int cmp( const void *a , const void *b) { return *(char *)a - *(char  *)b; }   qsort(word,100,sizeof(word[0]),cmp);   三、对double类型数组排序(特别要注意)   double in[100];   int cmp( const void *a , const void *b) { return *(double *)a > *(double *)b ? 1 : -1; }   qsort(in,100,sizeof(in[0]),cmp);   四、对结构体一级排序   struct In { double data; int other; }s[100]   //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写   int cmp( const void *a ,const void *b) { return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1; }   qsort(s,100,sizeof(s[0]),cmp);   五、对结构体......

阅读全文(2543) | 评论:0

招聘网站(2007-03-29 14:50:00)

摘要:chinahr.com 从1999年以来我所有的工作都是通过这个网站找得,国内知名企业大多都使用此媒体,在北京的朋友一般不会没有收获,今年春节后一周内,通过此网站,居然有7家企业邀请我去面试。 zhaopin.com 如果你能被这家网站上的企业相中,那说明你一定是很有实力得,此网站集中了很多知名外企,当然如果你相被猎中的话,一定要具备英文功底,曾经两家IT世界知名公司面试,可以被E文所限,失之交臂。 www.jobcn.com,www.cjol.com 在广东的朋友可以集中在这两个网站找工作,以前在老家的时候,就是接到了这两个网站上的公司的机会,可惜来了北京。   还有家著名的网络招聘媒体我没说,我想大家都知道,我在这家网站发布过很多次简历及应聘信息,但从无回音,以至我很是怀疑它的数据的真实性,NASDAQ又怎么了,后来听一位业内朋友说,此网站主要以HR外包业务为主,网站只是个摆设。 www.gongzuo123.com
如果您接到应聘通知的时候,一定要到这家网站转转,看看别人怎么评价这家企业得,或者直接从同事录里给同事发MAIL问问内部情况,
往往有意向不到的收获。此网站汇集了15W家网络上招聘的企业,包括各行业。......

阅读全文(1926) | 评论:0