Windows体系及编程结课作业||||专业班级:学生姓名:学号:成绩:指导教师:提交日期:2015.4.28(结课作业如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm,右2.1cm;字体:宋体小四号,1.25倍行距。)思考题:一、讨论编程语言工具的选择(例如Java、Delphi、C++Bulider、VC、VB、C#、PHP、Perl、Python、Ruby、JavaScript、JScript、VBScript、PowerBuilder、MatLab等等)二、多线程同步和互斥有何异同,分别有几种实现方法,都是什么?每种方法的优点和不足是什么?三、比较Windows的GDI、GDI+和WPF等图形子系统。四、探讨MFC框架,.NET框架和Win32/64API的内容、特点、发展和比较。五、DLL注入和API拦截的方法有几种,都是什么?六、Windows编程实践、体会及课程学习建议。请回答上述思考题,要求内容较为详实,有独立的见解。一、一般情况下开发小型应用程序应使用VisualBasic、.NET软件应使用C#、开发大型/系统软件时最好选用VisualC++、开发网络/安全软件应选用Java、开发Web/XML件选用Java或VisualC#、开发数据库通用软件应选用Delphi/PowerBuilder开发网页选用HTML/Javascript/PHP/ASP.NET等语言。Java面向对象、安全、跨平台、强大稳健、流行的程序设计语言与环境。由Sun公司开发语言风格较为接近C++与C#而最为人熟知的便是跨平台性。Java分为JavaSE标准版面向初学者与桌面开发、JavaEE企业版也称J2EE面向企业级开发、网络开发包括了为人熟知的JSP并包含了JavaSE的所有内容、JavaME微型版为手机、PDF、机顶盒、消费家电等嵌入设备开发目前还有正在发展的JavaFX一种富Internet应用程序开发的脚本语言。C++应用最广泛、成熟、强大、复杂、流行的程序设计语言。目前正在使用的Windows或Linux操作系统的大部分内容均出自C++的程序员之手C++非常强大近乎无所不能而C++代码经过编译后将成为计算机的二进制代码的可执行程序所以在兼容性、性能上均为优秀。当今如果你学习C++再配合WIN32SDK、MFC或是.NETCLR绝对是开发桌面程序的首选语言。从名字可以看出C++改进自C语言特别是面向对象方面的扩展。C++首选的集成开发环境IDE自然是VisualC++。C#微软的C#就好似是C++、Java、Delphi与VisualBasic的结合体是新兴、易学、强大的程序设计语言它更像Java完全面向对象开发与运行都在.NETFramework环境中。使用微软强大的VisualStudio集成开发环境这是快速开发Windows平台桌面应用程序的最好选择。C#也可以开发ASP.NET的动态网页程序这是曾经风火多年的ASP的替代产品。开发C#程序使用微软的VisualStudio是最好的也是几乎唯一的选择。Python新兴的面向对象脚本语言。Python作为脚本语言跨平台性非常好几乎在所有操作系统中可以使用可以进行桌面程序开发、动态网页开发、数据运算等。不需要担心商业授权、付费这些额外的问题Python本身就是免费软件、自由软件。Ruby较Python来说更新兴的面向对象脚本语言由日本人开发。实质上它与Python是同类具有共同的一些特性、脚本语言、面向对象、免费开源、简洁强大、跨平台性。Python与Ruby都是目前的新兴流行脚本语言。PHP是目前最流行、强大、稳健的动态网页开发脚本语言。它的语言风格类似C、Perl可以集成在HTML网页代码只中也遵循面向对象并且易于学习。其实PHP还可以开发桌面应用程序主要作为动态网页开发语言。目前最流行的开发环境组合就是Linux+ApacheHTTPServer+MySQL+PHP简称为LAMP。开发与学习推荐的IDE有ZendStudio、Eclipse甚至是Dreamweaver。Perl最具成熟、灵活性的脚本语言。学习较为容易但却非常强大。Python语言的Windows体系编程结课作业第页共页许多特性便是有借鉴自Perl。Perl拥有一个大型的第三方代码库CPAN极大的方便于程序人员的开发和使用。在官方网站下载Perl环境所有的Linux系统都几乎集成了Perl。脚本语言的开发都推荐在Notepad++等高级文本编辑器中完成。Pascal曾经风靡全球的高级程序设计语言特点是语言简明、结构严谨、较高灵活性名气不下于C++。国际信息学奥林匹克、中国信息技术奥林匹克竞赛的编程项目主要语言。Basic或称为Basic系列语言主要有QuickBasic、QBasic、VBScript、VisualBasic、VisualBasic.NET甚至有适于儿童学习的SmallBasic。二、线程同步是指线程之间所具有的一种制约关系一个线程的执行依赖另一个线程的消息当它没有得到另一个线程的消息时应等待直到消息到达时才被唤醒。线程互斥是指对于共享的进程系统资源在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时任何时刻最多只允许一个线程去使用其它要使用该资源的线程必须等待直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。线程间的同步方法大体可分为两类用户模式和内核模式。顾名思义内核模式就是指利用系统内核对象的单一性来进行同步使用时需要切换内核态与用户态而用户模式就是不需要切换到内核态只在用户态完成操作。用户模式下的方法有原子操作例如一个单一的全局变量临界区。内核模式下的方法有事件信号量互斥量。原子操作全局变量利用全局变量来进行线程间的同步当子线程结束时改变该值而父线程则循环判断该值来确认子线程是否已经结束当子线程结束时父线程才继续进行下面的操作。临界区CriticalSection保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起并一直持续到进入临界区的线程离开。临界区在被释放后其他线程可以继续抢占并以此达到用原子方式操作共享资源的目的。临界区包含两个操作原语EnterCriticalSection进入临界区LeaveCriticalSection离开临界区EnterCriticalSection语句执行后代码将进入临界区以后无论发生什么必须确保与之匹配的LeaveCriticalSection都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快但却只能用来同步本进程内的线程而不可用来同步多个进程中的线程。事件Event事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。信号量包含的几个操作原语CreateEvent创建一个信号量OpenEvent打开一个事件SetEvent回置事件WaitForSingleObject等待一个事件Windows体系编程结课作业第页共页WaitForMultipleObjects等待多个事件WaitForMultipleObjects函数原型WaitForMultipleObjectsINDWORDnCount,//等待句柄数INCONSTHANDLE*lpHandles,//指向句柄数组INBOOLbWaitAll,//是否完全等待标志INDWORDdwMilliseconds//等待时间参数nCount指定了要等待的内核对象的数目存放这些内核对象的数组由lpHandles来指向。fWaitAll对指定的这nCount个内核对象的两种等待方式进行了指定为TRUE时当所有对象都被通知时函数才会返回为FALSE则只要其中任何一个得到通知就可以返回。dwMilliseconds在这里的作用与在WaitForSingleObject中的作用是完全一致的。如果等待超时函数将返回WAIT_TIMEOUT。事件可以实现不同进程中的线程同步操作并且可以方便的实现多个线程的优先比较等待操作例如写多个WaitForSingleObject来代替WaitForMultipleObjects从而使编程更加灵活。互斥量Mutex互斥量跟临界区很相似只有拥有互斥对象的线程才具有访问资源的权限由于互斥对象只有一个因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享而且可以在不同应用程序的线程之间实现对资源的安全共享。互斥量包含的几个操作原语CreateMutex创建一个互斥量OpenMutex打开一个互斥量ReleaseMutex释放互斥量WaitForMultipleObjects等待互斥量对象信号量Semaphores信号量对象对线程的同步方式与前面几种方法不同信号允许多个线程同时使用共享资源这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数每增加一个线程对共享资源的访问当前可用资源计数就会减1只要当前可用资源计数是大于0的就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目不能在允许其他线程的进入此时的信号量信号将无法发出。线程在处理完共享资源后应在离开的同时通过ReleaseSemaphore函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数S大于等于零时代表可供并发进程使用的资源实体数但S小于零时则表示正在等待使用共享资源的进程数。P操作申请资源1S减12若S减1后仍大于等于零则进程继续执行3若S减1后小于零则该进程被阻塞后进入与该信号相对应的队列中然后转入进程调度。V操作释放资源1S加12若相加结果大于零则进程继续执行3若相Windows体系编程结课作业第页共页加结果小于等于零则从该信号的等待队列中唤醒一个等待进程然后再返回原进程继续执行或转入进程调度。信号量包含的几个操作原语CreateSemaphore创建一个信号量OpenSemaphore打开一个信号量ReleaseSemaphore释放信号量WaitForSingleObject等待信号量信号量的使用特点使其更适用于对Socket套接字程序中线程的同步。例如网络上的HTTP服务器要对同一时间内访问同一页面的用户数加以限制这时可以为每一个用户对服务器的页面请求设置一个线程而页面则是待保护的共享资源通过使用信号量对线程的同步作用可以确保在任一时刻无论有多少用户对某一页面进行访问只有不大于设定的最大用户数目的线程能够进行访问而其他的访问企图则被挂起只有在有用户退出对此页面的访问后才有可能进入。综上所述当在同一进程中的多线程同步时临界区是效率最最高基本不需要什么开销。而内核对象由于要进行用户态和内核态的切换开销较大但是内核对象由于可以命名因此它们同时可以用于进程间的同步。另外信号量可以设置允许访问资源的线程或进程个数而不仅仅是只允许单个线程或进程访问资源。三、GDI是位于应用程序与不同硬件之间的中间层这种结构让程序员从直接处理不同硬件的工作中解放出来把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备。GDI是以文件的形式存储在系