❶ 制作exe程序需要用什么软件
有人把java和javascript都分不清了,呵呵。在大学时学过一点,全忘了,晕。
将Java应用程序本地编译为EXE的几种方法
1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。
2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。
4. 使用InstallAnywhere创建安装盘。
5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc
6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本:
http://www.excelsior-usa.com/jet.html
7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede已经不复存在了。
8. JToEXE
Bravo Zulu Consulting, Inc开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。
公司主页: http://www.bravozulu.com/
下面这个FTP上曾经有过这个软件,不知道现在是不是还在:
ftp://race.dlut.e.cn/pub/java/tools/jet
9.jbuilder
这个是Borland不公开的使用技巧,能够通过JBuilder来制作exe文件来启动Java文件。
JBuilder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动Java程序,可以出现或者不出现console窗口。想做到这些,需要JBuilder的bin目录下的这些文件:
JBuilder.exe
JBuilderW.exe (可选)
JBuilder.config
jdk.config
JavaLauncher.dll
“JBuilder.exe”是一个通用的可执行外壳文件,用以启动Java程序,”JBuilderW.exe“好像是javaw.exe一样,它把”JBuilder.exe”包装起来,但是运行时候不显示那个console的窗口。使用这些文件的关键是文件名。“JBuilder.exe”查找一个文件叫”JBuilder.config”的配置文件,里面包含了运行Java程序的必须信息。同样的”JBuilderW.exe”查找”JBuilder.exe”来启动不带Console窗口的Java程序。如果把JBuilder.exe重命名为”foo
.exe”,那”foo.exe”将去寻找”foo.config”配置文件,同样”JBuilderW.exe”被重命名为”fooW.exe”,它会去寻找”foo.exe”文件。
说到这里,聪明的读者应该猜到怎样利用JBuilder.exe来启动应用程序了。只要把JBuilder.exe,JBuilerW.exe,JBuilder.config改名成相应的文件名,在JBuilder.config里面指定主类和类路径,就能够通过执行JBuilder.exe(或者被改名后的exe文件)来启动Java应用程序了。下面是用本机为例。
Borland JBuilder 5被安装在E:\jbuilder5\目录下,在E:\jbuilder5\bin\下建立一个temp目录,然后把JBuilder.exe,JBuilder.config,JavaLauncher.dll,jdk.config四个文件拷贝到E:\jbuilder5\bin\temp\目录下,然后在这个目录下建立一个hello目录,在这个目录下生成一个hello.java文件,即E:\jbuilder5\bin\temp\hello\hello.java文件,
file://hello.java/
package hello;
public class hello{
public static void main(String s[]){
System.out.println("Hello, Exe file!");
}
}
编译成class文件,然后打开Jbuilder.config文件,作相应的修改:
在JBuilder.config里面找到下面两行
# Start JBuilder using the its main class
mainclass com.borland.jbuilder.JBuilder
修改为
# Start JBuilder using the its main class
mainclass hello.hello
addpath E:/jbuilder5/bin/temp/
addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在JBuilder/bin目录下的config_readme.txt里面找到详细说明。
然后将jdk.config里面的javapath修改成相对的路径,例如原来是
javapath ../jdk1.3/bin/java
修改成
javapath ../../jdk1.3/bin/java
最后
将JBuilder.exe,JBuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件。
现在执行foo.exe文件
至此,通过修改JBuilder来使用exe文件启动自己的Java应用程序已经完成了。
但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将Jar文件打包进入exe文件!
假设利用上面的文件,生成hello.jar包,
jar cvf hello.jar hello\*.class
然后将jar包附加到JBuilder.exe后面去,
/b ..\JBuilder.exe+hello.jar foo.exe
在foo.config(JBuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径:
addpath E:/jbuilder5/bin/temp/foo.exe
然后执行,foo.exe
看到了么?一个含jar包的exe文件被执行了!
这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够容易的被执行。
请注意:读者如果使用这个功能,得自己承担可能带来的风险,因为Borland对这个功能不提供官方的支持!
还可以去看看 http://www-900.ibm.com/developerWor...ive/index.shtml这是一篇分析的文章,但它提供了很多有用的资料。
❷ 什么是“C加加”啊
C加加就是c++。
C++,C语言这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
(2)hpc编译器论文扩展阅读:
C++的语言特点:
1、支持数据封装和数据隐藏
在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。
在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。
完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只要知道如何使用它即可。
2、支持继承和重用
在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。
3、支持多态性
采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。
继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。
❸ HMAP鏄浠涔
蹇阃熷叆闂
绗涓绔 hmap寮鍙戠殑锘烘湰鐜澧冨拰宸ュ叿
1.1 锘烘湰鐜澧
鐢变簬宓屽叆寮忓紑鍙戠殑鐗规畩镐,浣垮缑瀹幂殑寮鍙戜笉璞″紑鍙戝叾瀹冨簲鐢ㄨ蒋浠朵竴镙峰叿链夌浉钖岀殑寮鍙戣繍琛岀幆澧,锲犺屽祵鍏ュ纺杞浠剁殑寮鍙戜笌杩愯岀殑鐜澧冧笉涓瀹氢缭鎸佷竴镊存.
1.1.1 纭浠剁幆澧:
Pentium绾у勭悊鍣ㄧ殑妗岄溃璁$畻链,寤鸿浣跨敤Pentium 150-MHz鎴栨洿楂樻。娆$殑澶勭悊鍣.
绗﹀悎妗岄溃璁$畻链鸿勮寖瑕佹眰镄凛D-ROM椹卞姩鍣.
VGA鎴栧叿澶囨洿楂樿В鏋愬害镄勬樉绀哄櫒.寤鸿浣跨敤Super VGA鏄剧ず鍣.
榧犳爣鎴栧叾瀹冨吋瀹规寚镣硅惧.
瓒冲熺殑纭鐩樼┖闂.
链灏忓寲瀹夎呮柟寮(鍖呮嫭eMbedded Visual C++鍜屼竴涓猄DK)镓闇纾佺洏绌洪棿:360 MB.
瀹屽叏瀹夎呮柟寮(鍖呮嫭eMbedded Visual Basic,eMbedded Visual C++鍜屼笁涓猄DK)镓闇纾佺洏绌洪棿:720 MB.
6) 濡傛灉镎崭綔绯荤粺涓篧indows 98 Second Edition,搴旇呖灏戦厤澶24 MB鍐呭瓨(寤鸿浣跨敤48 MB);濡傛灉镎崭綔绯荤粺涓篧indows NT Workstation 4.0鎴朩indows 2000,鍒椤簲镊冲皯閰嶅32MB鍐呭瓨(寤鸿浣跨敤48 MB).
1.1.2 杞浠剁幆澧:
1)Microsoft Windows 2000 Professional/閰嶅嘢P5镄凪icrosoft Windows NT Workstation 4.0,Internet Explorer 5.01鍙奙DAC 2.1;鎴朚icrosoft Windows 98 Second Edition.
2)Microsoft eMbedded Visual Tools 3.0鍙婂叾浠ヤ笂鐗堟湰
3)hMap绫诲簱
1.2 寮鍙戝伐鍏
寮鍙戝伐鍏蜂富瑕佹槸涓浜涘祵鍏ュ纺镄勫紑鍙戝伐鍏,涓昏佹槸Microsoft eMbedded Tools鍜学indows CE Tools涓や釜宸ュ叿,Microsoft eMbedded Tools鎻愪緵闆嗘垚寮鍙戠幆澧,Windows CE Tools鎻愪緵SDK鍙婂叾妯℃嫙鍣ㄧ幆澧.
1.2.1 寮鍙戝伐鍏峰畨瑁
Microsoft eMbedded Tools镄勫畨瑁呯▼搴忎竴鑸涓嶹indows CE Tools镄勫畨瑁呯▼搴忕粦鍦ㄤ竴璧,锲犳や袱娆惧伐鍏峰父甯告槸钖屾椂瀹夎.涓嬮溃瀵筂icrosoft eMbedded Tools 3.0鍜学indows CE Tools 3.0瀹夎呯殑杩囩▼缁椤嚭涓涓绠瑕佹ラ:
钖锷∕icrosoft eMbedded Tools 3.0瀹夎呯▼搴,寮濮嫔畨瑁(瑙佸浘1.2.1.1)
镙规嵁鐣岄溃鎻愮ず镎崭綔,褰撹緭鍏ヤ骇鍝両D钖庝细寮瑰嚭瀹夎呯粍浠跺硅瘽妗(瑙佸浘1.2.1.2),铹跺悗瀹夎呮枃浠跺皢鍒嗛変腑镄勯夐”杩涜岀浉搴旂殑瀹夎,锲犳や细鍑虹幇澶氭$殑瀹夎呭硅瘽妗.
镙规嵁鐣岄溃鎻愮ず镎崭綔榛樿ゆ搷浣,鍑虹幇Microsoft eMbedded Tools镄勫畨瑁呴夋嫨瀵硅瘽妗(灏嗗浘1.2.1.3)
铹跺悗杩涜孧icrosoft eMbedded Tools骞舵樉绀鸿繘搴︽浔,瀹屾垚钖庡紑濮媁indows CE Platform SDK (H/PC Pro) 瀹夎(瑙佸浘1.2.1.4)
阃夋嫨榛樿ゅ,H/PC Pro瀹夎呭畬鎴愬悗寮濮媁indows CE Platform SDK (Palm-size PC 1.2)镄勫畨瑁(瑙佸浘1.2.1.5)
阃夋嫨榛樿ゅ,Palm-size PC 1.2瀹夎呭畬鎴愬悗寮濮媁indows CE Platform SDK (Pocket PC )镄勫畨瑁(瑙佸浘1.2.1.6)
锲1.2.1.1 镣瑰嚮setup.exe寮濮嫔畨瑁,镣瑰嚮Next鎸夐挳
锲1.2.1.2 阃夋嫨闇瑕佸畨瑁呯殑缁勪欢阃夋嫨钖庣偣鍑"Next"鎸夐挳
锲1.2.1.3 阃夋嫨鐩稿簲瀹夎呯粍浠舵垨阃夋嫨"Select All",铹跺悗镣瑰嚮"Continue"鎸夐挳
锲1.2.1.4 寮濮嫔畨瑁匴indows CE Platform SDK (H/PC Pro)
锲1.2.1.5 鍑嗗囧紑濮嫔畨瑁匴indows CE Platform SDK (Palm-size PC 1.2)
锲1.2.1.6 鍑嗗囧紑濮嫔畨瑁匴indows CE Platform SDK (Pocket PC)
1.2.2 Microsoft eMbedded Tools 3.0绠浠
Microsoft eMbedded Visual C++ 3.0鏄寰杞鍏鍙镐负寮鍙慦indows CE搴旂敤绋嫔簭钥屼笓闂ㄥ紑鍙戠殑涓涓闆嗘垚寮鍙戠幆澧.鍒╃敤杩欎釜闆嗘垚寮鍙戠幆澧,鍙浠ュ揩阃熷紑鍙戝嚭鍏蜂綋镄勫簲鐢ㄧ▼搴.瀹冧笌Microsoft Visual C++涓镙,閮芥槸锷熻兘寮哄ぇ,搴旂敤𨱔垫椿镄勫紑鍙戝伐鍏,鐣岄溃涔熷緢鐩镐技.涓嵘isual C++6.0涓嶅悓镄勬槸Microsoft eMbedded Visual C++ 3.0涓嶆敮鎸佸氭枃妗g晫闱,涓嶆敮鎸侀潪32浣岖殑鍑芥暟,鍏跺畠Windows涓嬮溃镄 API鍑芥暟涓崭竴瀹氭敮鎸,鍙鏀鎸乁nicode瀛楃,闄ゆや箣澶,瀹幂殑缂栬疟鍜岃皟璇曢夐”涔熸槸涓崭竴镙风殑,瑙佸浘1.2.2.1.
鐢变簬鍦╓indows CE绯荤粺涓嬭繍琛岀殑绋嫔簭,涓崭粎钖岃惧囩被鍨嬫湁鍏,杩桦悓鍏蜂綋璁惧囩殑CPU绫诲瀷链夊叧,涓嶅悓镄凛PU绫诲瀷,闇瑕佷笉钖岀殑缂栬疟浠g爜,锲犳ゅ湪缂栫爜鍜岃皟璇曡繃绋嬩腑,瑕佹敞镒忛夋嫨瀵瑰簲镄勮惧囩被鍨,CPU绫诲瀷鍜岃繍琛岀幆澧.
1.2.3 Windows CE Tools 3.0绠浠
Windows CE Tools 3.0镄勫畨瑁呬富瑕佹槸涓轰简瀹夎呭祵鍏ュ纺寮鍙戠殑妯℃嫙鐜澧,璁╁紑鍙戠殑绋嫔簭濡傚悓鍦ㄧ浉搴旂殑宓屽叆寮忚惧囦笂涓镙疯皟璇曞拰杩愯.瀹冩槸涓涓寮鏀剧殑鍙镓╁𪾢镄32浣嶆搷浣灭郴缁.
Windows CE阍埚逛笉钖岀殑windows搴旂敤骞冲彴鎻愪緵浜嗕笉钖岀殑妯℃嫙鍣ㄧ郴缁,濡侾ocket PC emulation阍埚笔ocket PC ,CH/PC Pro emulation阍埚笴H/PC Pro,Palm-size PC 1.2 emulation阍埚笔alm-size PC 1.2,浠栦滑镄勭晫闱㈠傚浘1.2.3.1,锲1.2.3.2,锲1.2.3.3镓绀.
Windows CE缁欑▼搴忓紑鍙戣呮彁渚涗简涓崄icrosoft Win32API,ActiveX鎺у埗,淇℃伅阒熷垪链哄埗(MSMQ),瀵硅薄缁勪欢妯″瀷(COM),锷ㄦ佹ā𨱒垮簱(ATL),MFC搴撶浉浼肩殑鐜澧,钖屾椂Windows CE杩樻彁渚涗简涓绉嶅悓姝ヨ惧嘇ctiveSync,镞犺哄逛覆琛屽纺阃氢俊,绾㈠栫嚎鎺ュ彛阃氢俊鎴栨槸缃戠粶绾胯矾镄勯氢俊閮芥彁渚涘彴寮忚惧囦笌宓屽叆寮忚惧囱繛鎺ヤ笂镄勬柟渚.
锲1.2.3.1 Palm-size PC 1.2妯℃嫙鍣ㄧ晫闱 锲1.2.3.1 Pocket PC妯℃嫙鍣ㄧ晫闱
锲1.2.3.3 H/PC Pro妯℃嫙鍣ㄧ晫闱
1.2.4杩愯岀幆澧
瀵逛竴涓宓屽叆寮忓簲鐢ㄧ▼搴忔潵璁,鍏朵富瑕佺洰镄勬槸涓轰简搴旂敤,锲犳ゅ彧链夊湪链缁堢殑杩愯岀幆澧冧笅,瀹冩墠鑳藉彂鎸ュ畠镄勪竴浜涘姛鑳界殑浣灭敤.杩愯岀幆澧冨寘𨰾浜呜蒋浠剁幆澧冨拰纭浠剁幆澧.杞浠剁幆澧冨寘𨰾浜哤indows CE(V3.0鎴栬呭叾鍗囩骇鐗堟湰,濡俉indows CE,纭浠剁幆澧冨侾alm Size PC,Handheld PC Pro(H/PC Pro),Pocket PC绛夋帉涓婄数鑴戝祵鍏ュ纺璁惧,鍐呭瓨闇姹备负16M鍙婂叾鐩稿尮閰岖殑璁惧,濡侴PS缁堢绛.
绗浜岀珷 hmap鎺т欢鍙婂叾鐩稿叧璁剧疆
2.1 hmap鎺т欢绠浠
hMap(Hand Map)鏄锘轰簬COM妯″瀷镄勫祵鍏ュ纺GIS(Embedded GIS)寮鍙戝钩鍙.闅忕潃绉诲姩淇℃伅璁惧(MID)镄勫彂灞,GIS阃愭ヨ繘鍏ュ悗PC鍙戝𪾢阒舵,宓屽叆寮廏IS搴旂敤涓嶆柇澧炲姞,杩鍒囬渶瑕佸熀纭镐у紑鍙戝钩鍙,hMap鏄婊¤冻杩欎竴甯傚満闇姹傜殑锘虹镐ц蒋浠,鍒╃敤瀹冨彲浠ヤ负绉诲姩淇℃伅璁惧囧揩阃熷湴寮鍙戝拰鏋勫缓钖勭岹IS/GPS/RS搴旂敤绯荤粺,濡侾DA涓婄殑GIS搴旂敤鍜屽崼鏄熷艰埅缁堢搴旂敤绛.
2.2 鏁版嵁鍑嗗
2.2.1 鏁版嵁镙煎纺
hMap鍏锋湁绮剧粌镄勫唴镙稿拰鏋侀珮镄勬祻瑙堥熷害,楂樻晥镄勬暟鎹铡嬬缉姣,链夋晥瑙e喅浜嗗湴锲炬暟鎹閲忎笌钖勭岖Щ锷ㄤ俊鎭璁惧囧瓨鍌ㄧ┖闂存湁闄愮殑鐭涚浘,鍦≒DA涓婇噰鐢―S3镄勫帇缂╂牸寮,鍗犵敤镄勫瓨鍌ㄧ┖闂存洿灏,链夋晥鍦拌В鍐砅DA璁惧囨櫘阆岖殑鐩稿瑰唴瀛樿缉灏忕殑闂棰,绯荤粺鑳藉熸洿锷犵ǔ瀹氩揩阃熷湴杩愯.閲囬泦钖庣殑鏁版嵁鍙杞鎴愮数锷涜嚜锷ㄥ寲绠$悊杞浠剁殑镙囧嗳镙煎纺.Hmap镄勬暟鎹鍖呭惈浜嗕袱绉岖被鍨嬬殑鏁版嵁:涓嶅彲淇鏀规暟鎹鍜屽彲淇鏀规暟鎹,鍦╤Map涓灏嗕粬浠鍒嗗埆鏀惧叆钖勮嚜镄勬暟鎹灞备腑,钖勮嚜绠$悊鐩稿簲绫诲瀷镄勬暟鎹.
鏁版嵁绫诲瀷
灞傚唴鏁版嵁瀛桦偍镙煎纺
鏄钖﹀彲缂栬緫
鏄钖﹁繘琛屽唴瀛樼紦鍐
涓嶅彲淇鏀
SP3
DB3
SPX
钖
钖
锲惧舰鏂囦欢
灞炴ф枃浠
绱㈠紩鏂囦欢
鍙淇鏀
DS3
DB3
鏄
鏄
锲惧舰鏂囦欢
灞炴ф枃浠
2.2.2 鏁版嵁鐩褰曡剧疆
灏嗘暟鎹𨰾疯礉鍒皐ce300\MS Pocket PC\emulation\palm300\My Documents鐩褰曚笅
2.3 阃氱敤瀛楃︿覆绫诲瀷鐜澧
Windows CE鏄锘轰簬Unicode镄勬搷浣灭郴缁,Windows NT鍜学indows 2000钖屾椂鏀鎸乁nicode鍜孉NSI,钥学indows 9x鍒欐槸锘轰簬ANSI镄勬搷浣灭郴缁.钥冭槛鍒拌繖涓𨱍呭喌,锘轰簬hMap镄勭▼搴忓紑鍙戞棦涓嶈兘浣跨敤LPWSTR涔嬬被镄刄nicode瀛楃︿覆绫诲瀷,锲犱负Windows 9x涓嶆敮鎸;涔熶笉鑳戒娇鐢╟har, LPSTR涔嬬被镄𪞝NSI瀛楃︿覆绫诲瀷,锲犱负Windows CE涓嶆敮鎸.镓浠ュ繀椤讳娇鐢ㄩ氱敤瀛楃︿覆绫诲瀷.阃氱敤瀛楃︿覆绫诲瀷鏄镙规嵁鐩镙囨搷浣灭郴缁熺殑涓嶅悓,鍦ㄧ紪璇戠▼搴忔椂鏄犲皠涓烘g‘镄勫瓧绗﹂泦(ANSI鎴朥nicode)镄勫畯.杩欎簺鍙浠ヤ娇鐢ㄧ殑瀛楃︿覆绫诲瀷鍖呮嫭:TCHAR,TCHAR*,LPTSTR,LPCTSTR.褰撶劧,涔熷彲浠ヤ娇鐢∕FC CString绫.绋嫔簭涓镄勭‖浠g爜瀛楃︿覆蹇呴’鍖呭惈鍦═EXT瀹,L瀹忔垨钥卂T瀹忎腑.涓庢ゅ悓镞,杩橀渶瑕侀夌敤姝g‘镄凴TL(杩愯屾椂搴)瀛楃︿覆澶勭悊鍑芥暟,钥屼笉鑳戒娇鐢ˋNSI鎴栬匲nicode镄勫嚱鏁 .
2.4 鎺т欢绫诲簱鏂囦欢璁剧疆鍜屽簱缂栬疟鏂囦欢璁剧疆
2.4.1 鎺т欢绫诲簱鏂囦欢璁剧疆
褰撴柊寤轰简涓涓锘轰簬鎺т欢镄勫伐绋嫔悗,瑕佷娇鐢ㄦ带浠秇map,蹇呴’灏嗘带浠剁殑hmap.h,hmapwnd.h,hmap.cpp,hmapwnd.cpp𨰾疯礉鍒板垰寤虹珛镄勫伐绋嬬洰褰曚笅,铹跺悗灏嗗叾寮曞叆鍒板伐绋嬩腑,浠ヤ究鑳戒娇鐢ㄦ带浠剁殑鐩稿簲锷熻兘,鍏蜂綋浣跨敤瑙佷笅闱㈢殑锘轰簬hMap寮鍙戠ず锣冨伐绋嬩竴绔.
2.4.2 搴撶紪璇戞枃浠惰剧疆
搴旂敤绋嫔簭镄勭紪璇戝拰璋冭瘯杩愯岄渶瑕佽繛鎺ュ姩镐佸簱,涓岖℃槸Debug鐗堣缮鏄疪elease鐗埚潎闇瑕乵fcce300.dll,olece300.dll杩欎袱涓锷ㄦ侀摼鎺ュ簱鏂囦欢(涓や釜鏂囦欢涓镄"300"浠h〃瀵瑰簲镄刉indowsCE镄勭増链),锲犳ら渶瑕佽剧疆杩欎袱涓鏂囦欢镄勭洰褰,鏂规硶链夊备笅涓ょ:
1)灏唌fcce300.dll,olece300.dll涓や釜鏂囦欢𨰾疯礉鍒板备笅璺寰勭殑鐩褰曚笅:\Windows CE Tools\wce300\MS Pocket PC\emulation\ palm300\windows鍗冲畬鎴愯剧疆
2)鍦ㄥ缓绔嬩简鏂扮殑宸ョ▼钖,鐩存帴缂栬疟宸ョ▼,杩欐椂Microsoft eMbedded Visual C++浼氲嚜锷ㄦ悳.瀵诲苟杩炴帴涓や釜鏂囦欢,鍗冲畬鎴愯剧疆.
2.5 鎺т欢娉ㄥ唽
鎺т欢鍦ㄤ娇鐢ㄤ箣鍓嶅繀椤昏缂栬疟鐜澧冨簲鐢,锲犳ら渶杩涜宧map鎺т欢镄勬敞鍐,鏂瑰纺濡备笅:
灏呗map.ocx𨰾疯礉濡备笅璺寰勭殑鐩褰曚笅:\Windows CE Tools\wce300\MS Pocket PC\emulation\ palm300\windows
鍦ㄥ悓涓鐩褰曚笅鎼灭储regsvrce.exe鏂囦欢,杩愯屽悗寮瑰嚭娉ㄥ唽绐楀彛(瑙佸浘2.3.1)
濉鍏hmap.ocx,Action阃夐”阃夋嫨"Register",杞钖庣偣鍑"ok",濡傛灉娉ㄥ唽鎴愬姛鍒椤脊鍑烘敞鍐屾垚锷熺獥鍙(瑙佸浘2.3.2),钖﹀垯寮瑰嚭鍑洪敊绐楀彛(瑙佸浘2.3.3),妫镆ュ悗閲嶆柊娉ㄥ唽鍗冲彲.
锲2.3.1 娉ㄥ唽绐楀彛
锲2.3.3 娉ㄥ唽澶辫触
锲2.3.2 鎺т欢鎴愬姛娉ㄥ唽
绗涓夌珷 锘轰簬hMap镄勭ず渚嫔伐绋嫔紑鍙
浜呜В浜嗕互涓娄竴浜涘熀链镄勫紑鍙戠幆澧冨拰鐩稿叧镄勮剧疆涔嫔悗,鎴戜滑𨱒ヨ繘琛屽叿浣揿伐绋嬬殑寮鍙.浠ユゆ潵瀵瑰熀浜岿Map镄勫紑鍙戞湁涓涓镟存竻鏅扮殑鐞呜В.
3.1 瀹炵幇锷熻兘
婕旂ず濡备綍镓揿紑璁剧疆濂界殑鍦板浘,濡备綍杩涜屾斁澶,缂╁皬,婕娓,阃鍑虹瓑锘烘湰锷熻兘镎崭綔.
3.2 鍏蜂綋宸ョ▼锣冧緥
棣栧厛,鎴戜滑灏嗗垱寤轰竴涓鏂扮殑宸ョ▼,铹跺悗瀹炵幇锘烘湰镄勬搷浣滃姛鑳.
3.2.1 宸ョ▼鍒涘缓
钖锷╡Mbedded Visual C++ 3.0,阃夋嫨File/new,寮瑰嚭"new"瀵硅瘽妗(瑙佸浘3.2.1.1)阌鍏ュ伐绋嫔瓨鍌ㄨ矾寰"D:\work\"鍜屽伐绋嫔悕MapZoom,镣瑰嚮"OK"鎸夐挳.
鍦╯tep1阃夋嫨鍗曟枃妗e拰璇瑷璁剧疆,镣瑰嚮"Next"鎸夐挳.(瑙佸浘3.2.1.2)
鍦╯tep2阃夋嫨涓夹ctiveX Controls,镣瑰嚮"Next"鎸夐挳.(瑙佸浘3.2.1.3)
铹跺悗鍦ㄤ綑涓嬬殑鍑犳ヤ腑阃夋嫨榛樿よ剧疆(瑙佸浘3.2.1.4锝炲浘3.2.1.5),宸ョ▼鍒涘缓瀹屾瘯
鍦ㄥ垱寤哄ソ镄勫伐绋嬩腑杩涜学CE configulation璁剧疆(璁剧疆瑙佸浘3.2.1.6),缂栬疟宸ョ▼浣垮叾镊锷ㄩ摼鎺mfcce300.dll,olece300.dll鎴栬呮寜镦х浜岀珷镄2.5.2鑺傝繘琛岃剧疆.
6)寮曞叆hmap绫诲簱鏂囦欢鍒板伐绋嬩腑(瑙佸浘3.2.1.6锝炲浘3.2.1.8), 灏呗map.h,hmapwnd.h,hmap.cpp,hmapwnd.cpp𨰾疯礉鍒板垰寤虹珛镄勫伐绋嬬洰褰曚笅,铹跺悗灏嗗叾寮曞叆鍒板伐绋嬩腑. 瑕佷娇鐢ㄨ繖锲涗釜鏂囦欢涓镄勭浉搴斿姛鑳,蹇呴’鎸夌収3.2.3鑺备腑杩涜屽ご鏂囦欢镄勫寘钖.
鍒版,涓涓锘轰簬hmap寮鍙戠殑鏂扮殑宸ョ▼寤虹珛鎴愬姛.鍙浠ユ寜镦т笅涓鑺傜殑姝ラゅ疄鐜板熀链锷熻兘镎崭綔.
锲3.2.1.1 璁剧疆宸ョ▼璺寰勫拰宸ョ▼钖
锲3.2.1.2 阃夋嫨鍗曟枃妗
锲3.2.1.3 婧愭枃浠跺拰MFC搴撹剧疆
锲3.2.1.4 鍒涘缓镄勭被
锲3.2.1.5 镣瑰嚮"OK"宸ョ▼鍒涘缓瀹屾瘯
锲3.2.1.6 WCE configulation璁剧疆
锲3.2.1.6 鎺т欢绫诲簱鏂囦欢绫诲簱鏂囦欢寮曞叆
锲3.2.1.7 阃夋嫨瑕佸紩鍏ョ殑鏂囦欢
锲3.2.1.8 鏂囦欢寮曞叆钖庣殑Workspace镙
3.2.2 鏁版嵁鍜屾带浠惰剧疆
灏嗕緥瀛愭暟鎹鏁翠釜鏁版嵁鏂囦欢澶(wuhan)鍙婃带浠秇map.ocx鎸夌収绗浜岀珷涓2.3鑺傚拰2.4鑺傜殑鏂瑰纺杩涜屾嫹璐濆拰娉ㄥ唽.
3.2.3 澶存枃浠舵坊锷犱笌鎺т欢瀵硅薄鍒涘缓
1,鍦╯tdafx.h钖庨儴涓娣诲姞
#include "hmap.h"
#include "hmapwnd.h"
2,鍦∕apZoomView.h涓娣诲姞
#include "hmapwnd.h"
3,鍦∕apZoomView.h涓澹版槑
// Implementation
_DHMap m_hMapCtl; //澹版槑瀵硅薄
UINT m_nCurTool;//瀹氢箟鍏夋爣
4,鍦≧esource.h涓瀹氢箟瀵硅薄IDC_hMapCtl镄処D鍊:
IDC_hMapCtl 脳脳脳
("脳脳脳"浠h〃ID鍊,瀹冧緷鎹甊esource.h涓镄処D鍒楄〃璁剧疆)
5,鍦∕apZoomView.cpp涓鍒涘缓鎺т欢瀵硅薄
int CMapZoomView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//鍒涘缓hmap鎺т欢
CRect rectClient;
GetClientRect(&rectClient);
if (!m_hMapCtl.Create(_T("hello"), WS_VISIBLE,
rectClient, this, IDC_hMapCtl,NULL,FALSE,NULL))
{
DestroyWindow();
return FALSE;
}
return 0;
}
鍒涘缓鏂规硶鏄疌lass Wizard-Objects ID\CMPDAView-Messages\WM_CREATE-Member -functions\W OnCreate铹跺悗缂栬緫浠g爜,娣诲姞濡备笅浠g爜:
//鍒涘缓hmap鎺т欢
CRect rectClient;
GetClientRect(&rectClient);
if (!m_hMapCtl.Create(_T("hello"), WS_VISIBLE,
rectClient, this, IDC_hMapCtl,NULL,FALSE,NULL))
{
DestroyWindow();
return FALSE;
}
杩欎簺浠g爜灏卞彲浠ヤ简.
浠ヤ笂浣挎带浠跺硅薄镄勫畾涔夊拰鍒涘缓,涓嬮溃鍑犱釜灏忚妭灏嗗疄鐜板熀链锷熻兘.
3.2.4 锘烘湰锷熻兘瀹炵幇
3.2.4.1 阃鍑哄姛鑳藉疄鐜
澧炲姞阃鍑鸿彍鍗曟寜阍,鐩存帴灏 阃鍑虹殑ID璁剧疆涓篒D_APP_EXIT灏卞彲浠ヤ简.
凿滃崟椤瑰炲姞姝ラゅ备笅:
鍦╓orkspace涓镓揿紑ResourceView镙囩剧獥鍙,阃夋嫨Menubar涓镄処DR_MAINFRAME,骞堕紶镙囧弻鍑诲畠.(瑙佸浘3.2.3.1.1)
鍦ㄥ彸杈圭殑宸ヤ綔鍖轰笅閮ㄦ湁凿滃崟鍒涘缓镙忔樉绀,鍙屽嚮绌虹槠凿滃崟椤,寮瑰嚭Menu Item Properties绐楀彛.(瑙佸浘3.2.3.1.2)
鍦℅eneral镙囩鹃”濉鍏ID鍜孋aption椤.(ID:ID_APP_EXIT Caption :Exit)(瑙佸浘3.2.3.1.3)
鍏抽棴Menu Item Properties绐楀彛,Exit凿滃崟椤瑰垱寤哄畬姣.(瑙佸浘3.2.3.1.4)
锲3.2.3.1.1 Workspace涓璕esourceView镙囩剧獥鍙
锲3.2.3.1.2 Menu Item Properties绐楀彛
锲3.2.3.1.3 濉鍐橧D鍜孋aption
锲3.2.3.1.4 鍒涘缓鍙风殑Exit凿滃崟椤
3.2.4.2 镓揿紑鍦板浘锷熻兘瀹炵幇
凿滃崟鍒涘缓:鍒涘缓鏂规硶钖3.2.4.1鑺备腑凿滃崟椤瑰炲姞姝ラ,涓嶅悓涔嫔勫湪灏嗙涓夋ョ殑ID鍜孋aption椤,浠栦滑涓篒D:ID_ZOOM_OPENMAP Caption :Openmap
鏂规硶鍝嶅簲:Class Wizard-Objects ID\IDR_FILE_OPENMAP-Messages\CAMMND寮瑰嚭瀵硅瘽妗嗙偣OK(濡傛灉宸茬粡链変简鍑芥暟鍒椤湪Member functions涓浼氭湁鍑芥暟鍏拌壊鏄剧ず鎴栬嚜宸遍夋嫨宸茬粡瀛桦湪镄勫嚱鏁)铹跺悗鍦∕apZoomView.cpp涓缂栬緫浠g爜:
//镓揿紑鍦板浘
void CMapZoomView::OnZoomOpenmap()
{
CWaitCursor wait; //Do the lengthProcessing.
wait.Restore(); //Restore the Wait cursor.
IEmLayers layers(m_hMapCtl.GetLayers());
//lyrriver.SetGeoDataset(TEXT("\\My Documents\\xiamen\\姘寸郴.ds3"));
{
IEmMapLayer lyr;
lyr.CreateDispatch(TEXT("hMap.MapLayer"));
lyr.SetGeoDataset(TEXT("\\My Documents\\Wuhan\\鑳屾櫙.ds3"));
layers.Add(lyr);
}
{
IEmMapLayer lyr;
lyr.CreateDispatch(TEXT("hMap.MapLayer"));
lyr.SetGeoDataset(TEXT("\\My Documents\\Wuhan\\阆撹矾.ds3"));
layers.Add(lyr);
}
IEmRectangle emRect(m_hMapCtl.GetFullExtent());
emRect.ScaleRectangle(0.3);
m_hMapCtl.SetExtent(emRect);
}
3.2.4.3 鏀惧ぇ锷熻兘瀹炵幇
凿滃崟鍒涘缓:鍒涘缓鏂规硶钖3.2.4.1鑺备腑凿滃崟椤瑰炲姞姝ラ,涓嶅悓涔嫔勫湪灏嗙涓夋ョ殑ID鍜孋aption椤,浠栦滑涓篒D:ID_ZOOM_ZOOMIN Caption :Zoomin
鏂规硶鍝嶅簲:Class Wizard-Objects ID\IDR_FILE_ Zoomin-Messages\CAMMND寮瑰嚭瀵硅瘽妗嗙偣OK(濡傛灉宸茬粡链変简鍑芥暟鍒椤湪Member functions涓浼氭湁鍑芥暟鍏拌壊鏄剧ず鎴栬嚜宸遍夋嫨宸茬粡瀛桦湪镄勫嚱鏁)铹跺悗鍦∕apZoomView.cpp涓缂栬緫浠g爜:
void CMapZoomView::OnZoomZoomin()
{
IAwryRectangle emRect(m_hMapCtl.GetAwryExtent());
emRect.ScaleReactangle(0.6);
m_hMapCtl.SetAwryExtent(emRect);
}
瀹冨疄璐ㄤ笂鏄灏咰MapZoomView::OnZoomOpenmap()涓镄勬渶钖庝笁琛屼唬镰佹敼鍐.
3.2.4.4 缂╁皬锷熻兘瀹炵幇
凿滃崟鍒涘缓:鍒涘缓鏂规硶钖3.2.4.1鑺备腑凿滃崟椤瑰炲姞姝ラ,涓嶅悓涔嫔勫湪灏嗙涓夋ョ殑ID鍜孋aption椤,浠栦滑涓篒D:ID_ZOOM_ZOOM OUT Caption :Zoomout
鏂规硶鍝嶅簲:涓庢斁澶у姛鑳藉疄鐜扮浉浼煎湪MapZoomView.cpp涓缂栬緫浠g爜
void CMapZoomView::OnZoomZoomout()
{
IAwryRectangle emRect(m_hMapCtl.GetAwryExtent());
emRect.ScaleReactangle(1.5);
m_hMapCtl.SetAwryExtent(emRect);
}
3.2.4.5 婕娓稿姛鑳藉疄鐜
凿滃崟鍒涘缓:鍒涘缓鏂规硶钖3.2.4.1鑺备腑凿滃崟椤瑰炲姞姝ラ,涓嶅悓涔嫔勫湪灏嗙涓夋ョ殑ID鍜孋aption椤,浠栦滑涓篒D:ID_ZOOM_ZOO MPAN Caption :Pan
鏂规硶鍑芥暟鍝嶅簲:闇瑕佸搷搴斾簨浠,瑕佹坊锷犲搷搴斾簨浠剁殑鍑芥暟(瀵规疮涓浜嬩欢𨱒ヨ查兘闇瑕佸炲姞鍝嶅簲浜嬩欢镄勫嚱鏁)
鍦∕apZoomView.h涓澧炲姞涓涓澹版槑
class CMapZoomView: public CView
{
钬︹
protected:
钬︹
//鍝嶅簲浜嬩欢
afx_msg void OnEmMouseDown(OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
DECLARE_EVENTSINK_MAP()
};
鍦–MapZoomView.cpp锷犲叆濡备笅浠g爜
//鍝嶅簲浜嬩欢
#define DISPID_EMMOUSEDOWN 6L
BEGIN_EVENTSINK_MAP(CMapZoomView, CView)
ON_EVENT(CMapZoomView, IDC_hMapCtl, DISPID_EMMOUSEDOWN, OnEmMouseDown, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
鍦–MapZoomView.cpp瀹氢箟OnZoomPan
void CMapZoomView::OnZoomPan()
{
m_nCurTool = 1;//缁椤嚭婕娓哥殑鐘舵
}
鍦–MapZoomView.cpp瀹氢箟OnEmMouseDown浜嬩欢
//鍝嶅簲浜嬩欢
void CMapZoomView::OnEmMouseDown(OLE_XPOS_PIXELS x,
OLE_YPOS_PIXELS y)
{
if(m_nCurTool == 1)
m_hMapCtl.Pan();
}
鍒版,浣犲凡缁忚兘澶熻繍鐢‥VC宸ュ叿杩涜岀亩鍗旷殑锘轰簬hMap镄勫祵鍏ュ纺寮鍙,瀹炵幇姣旇缉绠鍗旷殑锷熻兘,褰撶劧闅忕潃瀛︿範镄勬繁鍏,浣犲皢浼氩彂鐜癶Map寮哄ぇ钥岀炲囩殑锷熻兘.
绗锲涚珷 鍦板浘镆ヨ
閴翠簬鍦板浘镆ヨ㈠姛鑳芥瘆绗涓夌珷镄勫熀链锷熻兘閲嶈佷笖澶嶆潅,链鍏ラ棬涓灏嗗湴锲炬煡璇浣滀负鍗旷嫭涓绔犲瑰畠锷犱互浠嬬粛.
鍦板浘镆ヨ㈠寘𨰾浜嗗浘褰㈠睘镐у拰灞炴ф煡璇.
锲惧舰鍒板睘镐х殑镆ヨ㈠寘𨰾:镣规煡璇,鐭╁舰镆ヨ,澶氲竟褰㈡煡璇,鍦嗗舰镆ヨ㈢瓑.
灞炴у埌锲惧舰镄勬煡璇涓昏佹槸妯$硦镆ヨ.
4.1 灞炴ф煡璇
璋幂敤灞备腑镄勬帴鍙SearchExpression,杩斿洖璁板綍闆
渚嫔:
IemLayer lyr;
lyr.SearchExpression(expression)
expression = "NAME = 绾㈡潐" 鎴
expression = "NAME like 绾㈡潐"
4.2 锲惧舰镆ヨ
鐩稿簲MouseDown浜嬩欢寰楀埌涓涓镣,绾,闱,鐭╁舰,鍦(澶氲竟褰㈣〃绀)绛夊浘褰㈠硅薄
璋幂敤hmap涓镄凾rackLine,TrackRectangle,TrackCircle,TrackPolygon
璋幂敤灞备腑镄勬帴鍙SearchShape(姝ラ1涓寰楀埌镄勫浘褰㈠硅薄),杩斿洖璁板綍闆
渚嫔:
//鐭╁舰镆ユ垒
void RectQuery(_DHMap& hMapCtl, CMapSelection& ASelection)
{
IEmLayers layers(hMapCtl.GetLayers());
IEmRectangle emRect(hMapCtl.TrackRectangle());
if(emRect.m_lpDispatch == NULL)
{
hMapCtl.RefreshNoRedraw();
return;
}
HMAPSELECTED selectObject;
for(int i = 0; i < layers.GetCount();i++)
{
IEmMapLayer lyr(layers.Item(COleVariant((short)i)));
LPDISPATCH pIUnknown = lyr.SearchShape(emRect, TEXT(""));
if(pIUnknown == NULL)
continue;
IRecordset recs(pIUnknown);
long nNameFieldIndex = recs.GetFieldIndex(TEXT("NAME"));
if(nNameFieldIndex 0)
ASelection.Add(selectObject);
}
}
hMapCtl.RefreshNoRedraw();
}
绗浜旂珷 甯歌侀梾棰
5.1 闂:Microsoft eMbedded Visual Tools 3.0鍒板簳鏄浠涔
绛:eMbedded Visual Tools 3.0鏄涓濂椾緵宓屽叆寮忓紑鍙戝晢鍦∕icrosoft Windows CE镎崭綔绯荤粺涓婇溃钖戞柊涓浠32浣嶈惧囩紪鍐栾蒋浠跺簲鐢ㄧ▼搴忕殑鐩稿叧宸ュ叿.瀹冩彁渚涗简Microsoft eMbedded Visual C++ 3.0寮鍙戠郴缁熷畬鍏ㄧ増,Microsoft eMbedded Visual Basic 3.0寮鍙戠郴缁熷畬鍏ㄧ増,SDK,杩灭▼宸ュ叿鍙婄浉鍏虫枃妗.
5.2 闂:eMbedded Visual Tools 3.0鍙闱㈠悜鍝浜涘井澶勭悊鍣ㄦ彁渚涙敮鎸
绛:eMbedded Visual C++鎻愪緵浜嗛拡瀵逛笅鍒楀井澶勭悊鍣ㄧ被鍨嬬殑缂栬疟鍣:ARM720,SA1100,MIPS,MIPS16,MIPSFP,PPC,SH3,SH4,THUMB,x86,x86璁惧囨ā𨰾熷櫒.
5.3 闂:eMbedded Visual Tools 3.0鏄钖︽敮鎸佹ā𨰾熸搷浣
绛:鏄镄.涓嶈繃,鍙链夊湪杩愯屼簬Microsoft Windows 2000 Professional鎴朚icrosoft Windows NT Workstation 4.0涔嬩笅镞舵墠浼氭敮鎸佹ā𨰾熸搷浣.
5.4 闂:鏄钖﹀彲鍦╓indows 98鎴朩indows 98 绗浜岀増涓嬭繍琛宔Mbedded Visual Tools 3.0
绛:eMbedded Visual Tools 3.0镞犳硶瀹夎呭湪Windows 98涔嬩笅.鍦ㄨ繍琛屼簬Windows 98 Second Edition骞冲彴涓婃椂,灏嗘棤娉曟墽琛屾ā𨰾熸搷浣;浣嗗叿澶囧叾瀹冨姛鑳.
5.5 闂:鍝閲屽彲浠ュ缑鍒癳MbeddedVisual Tools3.0
绛:璁块梾Microsoft Developer's Toolbox site.
涓嬭浇缃戝潃:http://download.microsoft.com/do ... CE_EMBDVTOOLS30.exe涓嬭浇钖,鎸夊畨瑁呭悜瀵兼寚绀哄畬鍏ㄥ畨瑁呭悗,鍙寰楀埌濡备笅杞浠: Microsoft eMbedded Visual tools(鍖呮嫭EVC3.0鍜孍VB3.0), SDK for pocket pc,SDK(HPC pro),SDK(Palm-size PC1.2),鍧囧寘钖镞㈠彲鍦ㄧ紪璇戞椂锷犺浇杩愯,鍙埚彲鐩存帴鍦ㄦ岄溃涓婅繍琛岀殑妯℃嫙鐜澧.涓嬭浇杞浠跺寘镐诲叡澶у皬304M.鎴栬呭备笅鍦板潃涔熷彲浠ュ缑鍒:
Microsoft eMbedded Visual Tools 3.0 涓嬭浇椤甸溃
http://www.microsoft.com/mobile/downloads/emvt30.asp
CDKey(寰杞鍏嶈垂鎻愪緵):TRT7H-KD36T-FRH8D-6QH8P-VFJHQ
Pocket PC 2002 Software Development Kit
http://download.microsoft.com/download/pocketpc/Install/2002/NT5XP/EN-US/PPC2002_SDK.exe
Pocket PC 2002 Emulator Images (涓鏂囩亩浣撴ā𨰾熷櫒)
http://download.microsoft.com/download/pocketpc/Utility/2002.1/NT5XP/EN-US/ChSimp-NoRadio.exe
5.6 闂:涓轰粈涔堟敞鍐宧map.ocx镞跺脊鍑烘敞鍐屼笉鎴愬姛镄勫硅瘽妗
绛:璇风‘瀹歨map.ocx鏄钖﹀湪\Windows CE Tools\wce300\MS Pocket PC\emulation\ palm300\windows鍗虫ā𨰾熷櫒镄剋indows鐩褰曚笅,钖屾椂纭璁mfcce300.dll,olece300.dll鏄钖﹀湪钖屼竴鐩褰曚笅,钖﹀垯璇锋寜镦2.4.2鑺傝繘琛屽簱缂栬疟鏂囦欢璁剧疆.
5.7 闂:浠g爜姝g‘浣嗙紪璇戜笉鎴愬姛鏀瑰备綍澶勭悊
绛:棣栧厛妫镆ユ暟鎹璺寰勮剧疆鏄钖︽g‘(瑙2.2.2鑺),鎺т欢璺寰勬槸钖︽g‘骞剁‘璁ゆ敞鍐屾垚锷(瑙2.5鑺),铹跺悗纭瀹欧CE Configulation宸ュ叿镙忎腑璁惧囩被鍨,CPU绫诲瀷,妯℃嫙鍣ㄨ剧疆鏄钖︽g‘(瑙3.2.1鑺傜5姝),镆ョ湅浠g爜鏄钖︽g‘.
闄勫綍:GPS镄勪娇鐢
涓,鍏ㄧ悆瀹氢綅绯荤粺绠浠
GPS鏄鐢辩编锲藉浗阒查儴寮鍙戠殑鏄熷熀镞犵嚎鐢靛艰埅绯荤粺.GPS姣忓ぉ24灏忔椂涓哄叏鐞冮檰,娴,绌虹敤鎴峰叏澶╀警鎻愪緵涓夌淮浣岖疆,阃熷害鍜屾椂闂.瀹冩瘆鍏跺畠镞犵嚎鐢靛艰埅绯荤粺绮惧害镟撮珮.闅忕潃鍏ㄧ悆瀹氢綅绯荤粺镄勪笉鏂鏀硅繘,纭,杞浠剁殑涓嶆柇瀹屽杽,搴旂敤棰嗗烟姝e湪涓嶆柇鍦板紑𨰾,鐩鍓嶅凡阆嶅强锲芥皯缁忔祹钖勭嶉儴闂,骞跺紑濮嬮愭ユ繁鍏ヤ汉浠镄勬棩甯哥敓娲.
GPS绯荤粺鍖呮嫭涓夊ぇ閮ㄥ垎:绌洪棿娈碘擥PS鍗鏄熸槦搴;鎺у埗娈碘斿湴闱㈢洃鎺х郴缁;鐢ㄦ埛娈碘擥PS淇″彿鎺ユ敹链.
浜,绌洪棿娈
绌洪棿娈电敱鍒嗗竷鍦6涓杞ㄩ亾闱涓婄殑24棰楀崼鏄熺粍鎴.鍗鏄熻建阆挞珮搴20,200 km,鍊捐55搴,锻ㄦ湡12灏忔椂.鍗鏄熺殑杞ㄩ亾鍒嗗竷淇濊瘉鍦ㄤ笘鐣屽悇鍦颁换浣曟椂闂村彲瑙佸埌镊冲皯6棰楀崼鏄.鍗鏄熻繛缁钖戠敤鎴锋彁渚涗綅缃鍜屾椂闂翠俊鎭.
涓,鍦伴溃鎺у埗娈
鎺у埗娈电敱涓涓涓绘带绔,5涓鐩戞祴绔,涓変釜娉ㄥ叆绔欑粍鎴.涓绘带绔欎綅浜嶤olorado.鐩戞祴绔栾窡韪瑙嗛噹鍐呮墍链塆PS鍗鏄,鏀堕泦鍗鏄熸祴璺濅俊鎭,骞舵妸鏀堕泦镄勪俊鎭阃佸埌涓荤珯.涓荤珯璁$畻鍗鏄熺簿瀵呜建阆,骞朵骇鐢熸疮棰楀崼鏄熺殑瀵艰埅淇℃伅,阃氲繃娉ㄥ叆绔欎紶阃佸埌鍗鏄.
锲,鐢ㄦ埛娈
鐢ㄦ埛娈电敱鎺ユ敹链,澶勭悊鍣ㄥ拰澶╃嚎缁勬垚.阃氲繃鎺ユ敹鍗鏄熷箍鎾淇℃伅璁$畻鍑虹敤鎴风殑浣岖疆阃熷害鍜屾椂闂.
GPS镄勬傚康鏄锘轰簬鍗鏄熸祴璺.鐢ㄦ埛阃氲繃娴嬮噺浠栦滑鍒板崼鏄熺殑璺濈绘潵璁$畻镊宸辩殑浣岖疆.鍗鏄熺殑浣岖疆褰揿凡鐭ュ.姣忎釜GPS鍗鏄熷彂阃佷綅缃鍜屾椂闂翠俊鍙.鐢ㄦ埛鎺ユ敹链烘祴閲忎俊鍙峰埌杈炬帴鏀舵満镄勬椂闂村欢杩,鐩稿綋浜庢祴閲忕敤鎴峰埌鍗鏄熺殑璺濈.钖屾椂娴嬮噺锲涢楀崼鏄熷彲浠ヨВ鍑轰綅缃,阃熷害鍜屾椂闂.
浜,GPS镄勫簲鐢
锘轰簬涓撶绣闆嗙兢阃氢俊骞冲彴镄勭Щ锷ㄧ洰镙囩洃鎺т笌绠$悊绯荤粺
锘轰簬GSM鐭娑堟伅锷熻兘镄勭Щ锷ㄧ洰镙囩洃鎺т笌绠$悊绯荤粺
GPS鍦ㄥ浗姘戠粡娴庡缓璁句腑镄勫簲鐢
GPS鍦ㄥぇ鍦版带鍒舵祴閲忎腑镄勫簲鐢
GPS鍦ㄥ湴褰,鍦扮睄鍙婃埧鍦颁骇娴嬮噺涓镄勫簲鐢
GPS鍦ㄥ叕瀹,浜ら氱郴缁熶腑镄勫簲鐢
GPS鍦ㄦ捣娲嬫祴缁树腑镄勫簲鐢
GPS鍦ㄨ埅娴疯埅绌哄艰埅涓镄勫簲鐢
GPS鍦ㄥ啘涓,鏋椾笟,镞呮父鍙婇噹澶栬冨疗涓镄勫簲鐢
镓嬫寔GPS鍦ㄥ啗阒熼嗗烟镄勫簲鐢
璁惧囩被鍨
CPU绫诲瀷
杩愯岀幆澧
锲1.2.2.1 Microsoft eMbedded Visual C++ 3.0 宸ュ叿镙(WCE Configuration)
❹ 软件加密与解密的前言
隐蔽软件(surreptitious software)是近十年来计算机安全研究领域新兴的一个分支。在隐蔽软件的研究过程中不仅需要借鉴计算机安全方面的技术,还会用到计算科学其他领域的大量技术,如密码学、隐写术、数字水印、软件量度(software metric)、逆向工程以及编译器优化等。我们使用这些技术来满足在计算机程序中安全存储秘密信息的需求,尽管这些需求的表现形式千差万别、各不相同。本书中“秘密”一词的意思比较广,书中所介绍技术(代码混淆、软件水印和指纹、防篡改技术以及软件“胎记”等)的使用目的是防止他人剽窃软件中的智力成果。比如,软件中使用指纹技术可以用来跟踪软件是否被盗版,代码混淆技术能够加大攻击者逆向分析软件的难度,而防篡改技术则可以使别人很难制作软件的破解版,等等。
好了,现在我们来讲讲为什么需要阅读本书,谁使用隐蔽软件以及本书将会涵盖哪些内容。
为什么阅读本书
与传统的安全研究不同,隐蔽软件不关心如何使计算机免于计算机病毒入侵,它关心的是计算机病毒的作者是如何防止他人分析病毒的!同样,我们也不关心软件到底有没有安全漏洞,我们关心的是如何隐蔽地在程序中加入一些只有在程序被篡改时才会执行的代码。密码学研究领域中,被加密数据的安全性依赖于加密密钥的隐秘性,而我们现在研究的恰恰是如何隐藏密钥。软件工程中有大量的软件量度技术,以确保程序结构良好,本书中将使用同样的技术使程序复杂难读。本书中描述的很多技术都是基于编译器优化技术研究开发的算法的,但是编译优化的目的是使编译器生成个头尽量小、运行速度尽量快的程序,而使用本书中介绍的一些技术却会使生成的程序个头又大,执行起来又慢。最后,传统的数字水印和隐写术是想办法把要隐藏的信息藏到图像、音频、视频甚至纯文本文件中,而隐蔽软件则是把需要隐藏的信息藏到计算机代码中。
那么,为什么要阅读本书呢?为什么要了解一种不能防止计算机被病毒或者蠕虫攻击的安全技术?为什么要学习一种只会让代码体积变大而执行速度变慢的编译优化技术?为什么要把精力花在一种违反了密码学基本前提(即密钥是不可能被攻击者获得的)的密码学分支上呢?
回答是,传统的计算机安全和密码学研究成果有时并不能解决实际工作中遇到的且亟待解决的安全问题。比如,在本书中将展示如何使用软件水印技术防止软件盗版。软件水印是在程序中嵌入的唯一标识(类似信用卡的卡号或者版权声明),通过这个标识,程序的某个副本就和你(程序的作者)或者客户联系在了一起。要是你发现市场上在卖自己软件的盗版光盘,就可以通过在盗版软件中提取的水印追查制作这个盗版软件的母版 当初是哪个家伙从你这里买走的。当给合作商提供新开发的游戏的测试版时,你也可以在测试版中加上数字水印。要是你感觉有人泄露了你的代码,就能(从众多的合作商中)找出肇事者,并把他送上法庭。
又比如,在程序的新版本中加上了某个新的算法,你当然不希望竞争对手也得到这个算法,并把它加到他们的软件中。这时,你就可以去混淆程序,使之尽可能变得复杂难懂,使竞争对手逆向分析软件时效率很低。而如果确实怀疑某人剽窃了你的代码,本书也会教你如何使用软件“胎记”证实你的怀疑。
再比如,你的程序中包含有某段不能为人所知的代码,并且你想确保没有这段代码程序就不能正常运行。例如,你肯定不希望黑客修改程序中的软件使用许可验证代码,或者可用于解密数字版权管理系统中mp3文件的密钥。第7章将讨论多种防篡改技术,确保受到篡改的程序停止正常运行。
听说你把密钥放在可执行文件里了?这主意实在太糟糕了!以往的经验告诉我们,任何类似“不公开,即安全” 的做法最终都将以失败告终,而且不管在程序中怎样隐藏密钥,最终它都逃不出一个足够顽强的逆向分析人员的手心。当然,必须承认你的做法也还是对的。本书中介绍的所有技巧都不能保证软件能永远免于黑客的毒手。不必保证某个东西永远处于保密的状态,也不必保证程序永远处于不可能被篡改的状态,更不需要保证代码永远不会被剽窃。除非这个研究领域有什么重大的突破,否则能指望的只是延缓对方的攻击。我们的目标就是把攻击者的攻击速度减缓到足够低,使他感到攻击你的软件十分痛苦或要付出过高的代价,从而放弃攻击。也可能攻击者很有耐心地花了很长时间攻破了你的防御,但这时你已经从这个软件中赚够了钱,或者已经用上了更新版本的代码(这时他得到的东西也就一钱不值了)。
比方说,你是一个付费频道的运营商,用户通过机顶盒来观看你提供的电视节目。每个机顶盒都是带有标签的——在代码的某个位置上存放了分配给每个用户的唯一标识(ID),这样你就可以根据用户的缴费情况决定是允许还是拒绝某个特定用户观看频道里的节目。可是现在有一个黑客团伙找到并且反汇编了这段代码,发现了计算用户ID的算法,并且在网上以低廉的价格把修改用户ID的方法卖给了网民。这时你该怎么办呢?你也许想到了使用防篡改的智能卡,不过这玩意儿并不像看上去那么难破解,这将在第11章中讲解。或者你可能想到要混淆代码,使之更难以被分析。或者你也可以使用防篡改技术使程序一被修改就自动停止运行。更有可能,你会混合使用上述各种技巧来保护代码。但是尽管使用了所有技术,你还必须要知道并且必须接受,你的代码仍然可能被破解,秘密仍会泄露(在这个案例里就是机顶盒里的用户ID仍然会被篡改)这一事实。怎么会这样呢?这只是因为“不公开,既安全”这个想法在根本上就存在漏洞。不过既然本书中介绍的所有技术都不能给你一个“完美并且长期的安全保证”,那么为什么还要使用这些技术,为什么还要买这样一本书呢?答案很简单,代码能顶住黑客攻击的时间越长,订阅频道的客户就越多,同时升级机顶盒的周期也就越长,这样你赚到的钱和省下的钱也就越多。
就这么简单。
谁使用隐蔽软件
很多知名的公司都对隐蔽软件有浓厚的兴趣。事实上很难真正掌握有关技术在实践中具体被使用的程度(因为大多数公司在如何保护自己的代码一事上绝对是守口如瓶的),但是我们还是可以根据他们专利的申请和拥有情况把他们对隐蔽软件的感兴趣程度猜个八九不离十。微软公司拥有多个关于软件水印[104,354]、代码混淆[62,62,69,69,70,70,180,378]和软件“胎记”[364]技术的专利。Intertrust公司拥有大量与数字版权管理技术相关的组合式专利,包括代码混淆和代码防篡改专利。2004年,在微软与Intertrust之间的马拉松式官司落下了帷幕之后,微软向Intertrust支付了高达4.4亿美元的专利使用费,才获得了后者所有的专利使用许可。同年,微软也开始与PreEmptive Solution公司开展商业合作[250],从而把PreEmptive Solution开发的identifier obfuscator(PreEmptive solution公司在该工具中拥有专利[351])加到了Visual Studio的工具集里。而普渡大学科研成果的副产品Arxan,因其独创的防篡改算法专利[24,305]而成功地开办了一家公司。苹果公司拥有一个代码混淆方面的专利,估计是用于保护其iTune软件的。Convera,一家从英特尔公司独立出来的企业,则着力研究应用于数字版权管理的代码防篡改技术[27,268-270]。从加拿大北方电信公司中分离出来的Cloakware公司也是这个领域里最成功的企业之一。该公司拥有他们称为“白盒加密”的专利[67,68,182],即把加密算法和密钥藏到程序代码中。2007年12月,Cloakware公司被一家主营付费电视业务的荷兰公司Irdeto以7250万美元的价格收购。即使是相对的后来者Sun Microsystem也已经提交了一些代码混淆领域的专利申请。
Skype的VoIP客户端也使用了类似Arxan[24]、英特尔[27]及本书中将要提到的[89]代码混淆和防篡改技术进行了防逆向工程加固。对于Skype公司来说,保护其客户端的完整性无疑是极其重要的,因为一旦有人成功逆向分析了其客户端软件,解析出Skype所使用的网络协议,黑客们就能写出廉价的能与Skype软件进行正常通信的程序(这样的话,人们就没有必要一定用Skype)。所以保持网络协议不公开则有助于Skype拥有一个庞大的用户群,这大概也是2005年易贝公司以26亿美元收购Skype的原因吧。实际上,使用隐蔽软件技术还使Skype公司赢得了足够多的时间,进而成为了VoIP技术的领军企业。即使这时Skype的协议被分析出来了(这一点黑客们确实也做到了,详见7.2.4节),黑客们也拿不出一个能够撼动Skype市场地位的类似软件了。
学术研究者从多种角度对隐蔽软件技术进行了研究。一些拥有编译器和程序语言研究背景的研究者,比如我们,会很自然地加入这一领域的研究,因为涉及代码转换的绝大多数算法都会涉及静态分析的问题,而这一问题则是编译优化技术的研究者再熟悉不过的了。尽管以前,密码学研究者大多不屑于研究“不公开,即安全”的问题,但最近一些密码学研究人员已经开始把密码学的相关技术应用于软件水印以及发现代码混淆技术的局限性上了。来自多媒体水印、计算机安全和软件工程方面的研究人员也已经发表了很多关于隐蔽软件的文章。遗憾的是,由于没有专门的刊物、学术会议(供研究人员相互之间进行交流),这一领域的研究进展被大大延缓了。事实上,为了使这些研究成果能被传统的学术会议和期刊接受,研究人员在不停地努力着,现在仍在努力。目前已经发表过隐蔽软件研究成果的学术会议有POPL(Principles of Programming Languages,程序设计原理)上的ACM专题研讨会、信息隐藏研讨会、IEEE的软件工程研讨会、高级密码学会议(CRYPTO)、ISC(Information Security Conference,信息安全大会)以及其他一些关于数字版权管理的学术会议。随着隐蔽软件这一领域的研究越来越成为学术研究的主流,我们有望拥有专门针对于隐蔽软件的期刊、专题讨论会甚至是研讨会,只是可惜目前为止这一切都还没有实现。
军方也在隐蔽软件上花了很多精力(和纳税人的钱)。比如,Cousot公司拥有的软件水印算法[95]专利就归属于世界上第九大国防工程承包商法国Thales集团。下面是一段引自最新的(2006)美军招标文件[303]中有关AT(anti-tamper)技术 研究的文字。
现在,所有的美军项目执行部门(PEO)和项目管理方(PM)在设计和实现有关系统时,必须在系统中使用军队和国防部制定的AT策略。嵌入式软件现代武器系统的核心,是被保护的最重要技术之一。AT技术能够有效地保证这些技术不被他国(人)逆向工程分析利用。仅仅由标准编译器编译生成而不加AT技术防护的代码是很容易被逆向分析的。在分析软件时,逆向工程分析人员会综合使用诸如调试器、反编译器、反汇编器等很多工具,也会使用各种静态和动态分析技巧。而使用AT技术的目的就是使逆向工程变得更为困难,进而防止美国在技术领域的优势被他国窃取。今后还有必要向部队的PEO和PM提供更有用、更有效并且多样化的AT工具集……研发AT技术的目的在于提供一个能够抗逆向工程分析的高强度壳 ,从而最大限度地迟滞敌方对被保护软件的攻击。这样美国就有机会维持其在高科技领域的优势或者减缓其武器技术泄密的速度。最终,美军就能继续保持其技术优势,进而保证其军备的绝对优势。
这份招标文件来自于美军导弹和空间程序(设计部门),专注于实时嵌入式系统的保护。我们有理由相信产生这份招标文件的原因是,美军担心射向敌方的导弹由于种种原因落地后未能爆炸,使敌方有机会接触到嵌入在导弹中负责引导导弹飞临目标上空的控制软件。
下面是另一段引自美国国防部[115]的文字。
进行主动式软件保护 (SPI)是国防部的职责之一,它必须开发和部署相关的保护技术,以保证含有国防武器系统关键信息的计算机程序的安全。SPI提供的是一种全新的安全防护方法,它并不(像传统的安全技术那样)保护计算机或者网络的安全,而只是加强计算机程序自身的安全。这种新方法能显着提升国防部的信息安全情况。SPI的适用范围很广,从台式机到超级计算机上面所有的程序都能使用SPI技术予以保护。它是(软件保护技术中)完整的一层,是“纵深防御”的一个范例。SPI技术是对网络防火墙、物理安全等传统安全技术的一个补充,但是其实现并不依赖于这些传统的安全设备。现在SPI技术被部署在选定的HPC中心和150多家国防部机关以及其他由商业公司参与建设和维护的军事基地。广泛地部署SPI技术将会有效地增强美国和美国国防部对关键应用技术的保护。
.上面这段话说明了什么?它说明美国国防部不仅关心导弹会不会掉到敌方领土上去,还关心在自己的安全系数和性能都很高的计算机中心运行的软件的安全。事实上,窃密和反窃密是防间谍机关和情报部门之间永恒的主题。比方说,一架战斗机上的某个程序需要更新一下,这时我们很可能就是用一台笔记本电脑连接到这架战斗机上进行更新操作。但是万一这台笔记本电脑不慎遗失了,或者干脆就被其他国家政府使用某种方法控制了,就像电影里常演的那样,这时会有什么情况发生呢?对方会马上把相关的代码拿去做逆向工程分析,并把分析的结果用于改进其战斗机中所使用的软件。更有甚者,对方会悄悄地在你的软件中加上一个特洛伊木马,并让飞机在特定的时间里从天上掉下来。如果我们不能绝对保证上述这一幕100%不可能发生的话,隐蔽软件至少可以作为安全防御的最后一道防线(至少还能做到事后的责任追究)。例如,飞机中的软件可以用有权访问相关软件的人的ID做一个指纹签名。要是哪天,在其他国家的战斗机上发现了这些代码,就可以立即对这些代码进行逆向分析,并进一步推算出谁是泄密事件的元兇。
什么?我听见你说,为什么我要对政府之间和商业巨头之间如何保护它们各自的秘密感兴趣呢?如果黑客破解了这些软件,他们也不过是通过自己的劳动换取一些微薄的利益而已啊。话虽如此,但是这些保护技术给你 带来的好处最终还是大于它给商业巨头带来的好处。理由是,对你来说,法律形式的保护措施(如专利、商标和版权)只有当你拥有足够的财力,能在法庭上把对方告倒的时候才会管用。换而言之,即使你认为某家大公司通过破解你的代码,剽窃了一个极有“钱途”的主意,你也无力通过那种马拉松式的官司在法庭上告倒微软,除非你有足够的经济实力能在这种财力的比拼中熬出头 。而在本书中讨论的保护技术(比如代码混淆和防篡改技术)则既廉价又好用,中小型企业和商业巨头均可使用。而且如果这时你去告这家大公司的话,也可以用水印或者软件“胎记”等技术,在法庭上当场拿出代码被剽窃的真凭实据来。
最后不得不简单地提一下另一类极其擅长使用隐蔽软件的人——坏蛋们。病毒的作者已经能非常成功地利用代码混淆的技术伪装病毒的代码,使之逃避杀毒软件的检测了。值得一提的是,人们使用这些技术(如保护DVD、游戏和有线电视)时经常被黑客破解,而黑客使用这些技术(如构建恶意软件)时,人们却很难抗击。
本书内容
隐蔽软件研究的目的是发明能够尽可能迟滞对手(逆向工程分析)进度,同时又尽可能地减少因为使用该技术,而在程序执行时增加的计算开销的算法。同时也需要发明一种评估技术,使我们可以说“在程序中使用了算法A之后,相对于原先的程序,黑客攻破新程序需要多花T个单位的时间,而新程序增加的性能开销是0”,或者最低限度我们也应该可以说“相对于算法B,使用算法A保护的代码更难被攻破”。特别要强调一下,隐蔽软件研究尚处于婴儿期,虽然我们在书中会把相关的保护算法和评估算法全都介绍给大家,但是这门艺术的现状却还并不理想(到时候你可不能太失望啊)。
在本书中,我们试图把当前所有有关隐蔽软件的研究成果组织起来系统化地介绍给读者。我们力争每章内容涵盖一种技术,并描述这一技术的应用领域以及目前可用的算法。第1章将给出隐蔽软件这个领域的一些基本概念;第2章用对抗性演示的模式介绍黑客逆向分析软件时常用的工具和技巧,然后针对这些工具和技巧介绍如何防范黑客的攻击;第3章详细讲述黑客和软件保护方用于分析计算机程序的技术;第4章、第5章和第6章分别介绍与代码混淆有关的算法;第7章介绍与防篡改技术相关的算法;第8章和第9章分别介绍与水印相关的算法;第10章介绍与软件“胎记”相关的算法;第11章讲述基于硬件设备的软件保护技术。
如果你是位企业管理人员,只是对隐蔽软件的研究现状和这些技术怎么应用到你的项目中感兴趣,那么只要阅读第1章和第2章就够了。如果你是位拥有编译器设计背景的研究人员,那么建议直接跳到第3章开始阅读。但是之后的章节还是最好顺序阅读。这是因为……呃,还是举个例子吧,介绍水印技术的章节中会用到在代码混淆章节中介绍的知识。当然在本书撰写过程中,我们还是尽量使各章内容都能独立成章的,所以(如果你拥有一些背景知识)偶尔跳过那么一两章也未尝不可。如果你是一位工程师,想要使用有关技术加固你的软件,那么强烈建议你仔仔细细地阅读第3章的所有内容,如果有条件的话,还应该再搞几本编译原理方面的教材恶补一下“程序静态分析”的知识。然后你就可以随意跳到感兴趣的章节去阅读了。如果你是名大学生,把本书作为一门课程的教材来阅读,那么就应该一页一页地完整阅读本书,期末别忘了做好复习。
希望本书能够做到两件事情。首先,希望能向你,亲爱的读者,证明代码混淆、软件水印、软件“胎记”和防篡改等技术里有大量妙不可言的想法,值得你花点时间去学习,而且这些技术也可以用来保护软件。其次,希望本书能把本领域内当前所有有用的信息汇集在一起,从而为隐蔽软件的深入研究提供一个良好的起点。
Christian Collberg和Jasvir Nagra
2009年2月2日(土拨鼠日)
P.S.实际上写作这本书还有第三个目的。要是在阅读本书时,你突然灵光闪现,冒出一个绝妙的主意,进而激发了你投身于隐蔽软件研究的雄心壮志,那么,亲爱的读者,我这第三个目的就算是达到了。请把你的新算法告诉我们,我们将把它加到本书的下一版里!
❺ C/C++2018年发展前景怎么样
C++博大精深,是一门可以学一辈子的语言,如果你有着10年C++开发经验,各大知名IT公司都会抢着要你;如果你有15年C++开发经验,年薪百万不是梦,而且必然小有名气,在C++圈叱咤风云。可谓是经验越多,价值越高,沉淀越厚,绝对是一次投入,终生受益!成为名副其实的永不过时的全栈型IT人才!
从TIOBE语言排行榜中我们可以发现,在过去逾15年的时间里,C++一直稳居最受欢迎语言列表的第三名。对一个老牌语言来说,这个成绩不算差了。
在大学里,有很多人早已接触过C语言编程。他们对C/C++感兴趣,自己主动学习。如果在一种好的学习环境下,兴趣所在,成长的会很快。这些人,知道自己所学所想,目的很明确,动力也很强,效率很高。
社会上也存在这样一大波人,非计算机专业,甚至是高中学历。他们中很多人不知道自己适不适合学C/C++编程,那么该怎样判断自己适不适合编程呢?首先需要确定你是否对编程感兴趣,自己是不是想在编程方面发展,如果是的话,建议快速选择中公优就业进行学习。(相关推荐:中公优就业C/C++周末精品班)
一、C++职位需求量大
2018年,C++职位需求量大的惊人,毕业后根本不用发愁没有工作,而且高薪!
下图是C++在智联招聘上的职位需求。从图中可以清楚看到:搜索日期是今天日,单单是北京一个城市的职位需求数量就达到了34282个!这么大的缺口谁来填补?你还会发愁找不到工作么?
小编只是把你平时看不到的数据,把这些巨大职位需求展现在你的眼前,扮演着搬运工的角色。我们时刻都在关注着市场动态,为你们提供最新的数据。建议你们也可以多去智联招聘或者前程无忧上查询,数据都是绝对真实的!
二、C++称霸的领域
C++是一门运用很广泛的计算机编程语言,适合于多种操作系统,因此也有着很广阔的运用领域。据不完全数据统计,C++在游戏、服务器端开发、数字图像处理、编译器、金融等领域中都是可以被用到的,下面我会给出一些建议。
游戏行业:几乎所有3A游戏都是使用C++编写的。大众公认电子游戏的开发者是软件行业里回报最高的工作之一,也是需求量最大的领域之一。因为速度非常重要,所以编写高效的代码就是最基本的要求。除了要懂C++之外,精通游戏开发更应注重理论与模式的钻研,而不限于特定的API或者Library。通常还必须具备高超的图形与数学技能,这些知识足够你活到老学到老。
HPC:以极限速度处理数据,要求对底层硬件有深刻的理解,这类知识可以直接应用在语言中。通用图形处理器(GPGPU)及CUDA、OpenCL之类的并行计算框架的出现,引发了对有这类技术的C++程序员的需求。如果深入到科学计算领域,还有很多能做的工作。不知你是否听说过机器学习?这是当今的热门话题。
编译器:这是小编最喜欢的领域,LLVM项目如此成功,以致于很难找到一种既未使用LLVM库编写前端,也没有使用LLVM生成字节码的流行语言,而这些全都是C++。尽管编译器是以各种语言编写而成,但其背后的实现原理是相同的。我们使用优化器、静态分析程序、调试程序、标准库、链接器以及所有其他相关的工具来工作。
金融领域:除此之外,金融领域也有很多工作需要有能力编写低延迟代码的程序员。在这个领域,数学背景也是一大加分亮点。该领域的大多工作可能都涉及到开发与维护高频使用的交易平台。另外如果不想挂着程序员的名头,这个领域也是很棒的选择。可以说负责设计并实现金融数学模型的宽客(Quant)职位是所有程序员中最有可能获得高额奖励的。
以上只是小编的几个建议,这些领域的共通点在于:无法通过数量取胜。也就是说,C++工程师的可替换性很低,公司必须付给他们更高的薪水,并让他们解决自己感兴趣的问题,才能把人留住。如果你对C/C++还有什么想要了解的问题,请关注优就业IT常见问题栏目。