摘要: 字符编码和字体的关系1. 字体是语言文字的书面表示,对于普通的书面交流,我们可以将字体在我们脑海中的图像影像画在纸上,例如我们写信时实际上就是在画字的形状。我们之所以能够正确地“画出字体”(实际就是我们平时说的写字),是因为我们从小就接受这种训练-----识字------实际就是记住字的形象,书面交流是把要表达的意思用我们脑海中记忆的图像(及文字)画出来即可。2. 现在考虑计算机如何显示文字,首先要明确的一点就是,计算机可不会从一年级开始学习识字,也就是计算机它是没有大脑的,它不能将文字转换成“脑海”中的直观影像。所以,计算机为了能显示文字,我们就必须让计算机能够知道文字的影像,所以出现了字体 阅读全文
posted @ 2013-12-12 12:34 a ray of sunshine 阅读(681) 评论(0) 推荐(0) 编辑
摘要: DirectX OpenGL和WPF都有2D和3D的渲染引擎,只不过DirectX和OpenGL采用原始的C/C++式的封装,同时DirectX是以COM接口的形式提供的,OpenGL是C函数式库,而WPF提供的2D,3D功能则是以.net类库提供的,从性能上来说DirectX和OpenGL的原生代码比WPF的托管代码更好。从可移植性上来说,OpenGL是跨平台的,而DirectX是以COM接口提... 阅读全文
posted @ 2013-12-11 23:43 a ray of sunshine 阅读(998) 评论(0) 推荐(0) 编辑
摘要: 1.two type of clipping one for improve performance two for effect 2.DC的中裁剪区域的分类 DC可以看成是被分配在矩形中的像素的集合,当DC没有任何限制时,DC中的任何一个像素都是可以被写的(所以DC中的任何区域都是可以绘制的)。当事实上DC内部维护着三种不同的区域,当DC被绘制时,DC会对其拥有的区域进行裁剪(clip... 阅读全文
posted @ 2013-12-08 11:14 a ray of sunshine 阅读(236) 评论(0) 推荐(0) 编辑
摘要: user32.dll提供了用户界面相互的API,例如CreateWindow, MessageBox等等,但是其底层是使用gdi32.dll中的函数来实现窗口界面的绘制,具体参考文章:User32.dll Lock the computer 虽然该文并不是讨论user32.dll和gdi32.dll的关系,但是其中有一句话:Many of the functions in user32.dll c... 阅读全文
posted @ 2013-12-06 23:01 a ray of sunshine 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 1. 使用名字注册和解析的优点 使用名字可以极大地方便记忆 使用名字可以在服务的分布式环境中增强容错性,例如提供服务的主机不能工作了,可以启动另一台主机,只要该主机的名字与原来主机的名字相同就可以继续提供服务,而客户端却没有任何察觉。 2. 名字空间(Name Space) dynamic name space static name space pe... 阅读全文
posted @ 2013-12-06 22:52 a ray of sunshine 阅读(177) 评论(0) 推荐(0) 编辑
摘要: // 将数组array通过除数取余法分散到hash数组中void BuildHash(int *hash, int *array, int n){ bool flag[HASH_LENGTH] = {false}; int index; for(int i = 0; i < n; i++) { index = array[i] % HASH_LENGTH; if(!flag[index]... 阅读全文
posted @ 2013-12-03 16:49 a ray of sunshine 阅读(146) 评论(0) 推荐(0) 编辑
摘要: // array为待查找数组// n为数组array的元素个数// key为查找的元素int BinarySearch(int *array, int n, int key){ int head = 0; int tail = n - 1; int middle; while(head array[middle]) { head = middle + 1; continue; ... 阅读全文
posted @ 2013-12-03 14:10 a ray of sunshine 阅读(178) 评论(0) 推荐(0) 编辑
摘要: // 顺序查找// array为待查找数组// n为数组array的元素个数// key为查找的元素int SequenceSearch(int *array, int n, int key){ for(int i = 0; i < n; i++) { if(key == array[i]) { return i; } } return -1;}顺序查找的时间复杂度为O(N) 阅读全文
posted @ 2013-12-03 13:49 a ray of sunshine 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 1.Console Handle(控制台句柄)1.1 进程的三种标准句柄 每个console进程都有standard input(STDIN), standard output(STDOUT), standard error(STDERR)三种句柄与之相关联,当系统创建console进程时,系统默认地将该进程的STDIN与该进程的控制台的输入缓冲区(input buffer)相关联,将该进程的STDOUT,STDERR与该进程的控制台的活动屏幕缓冲区(active screen buffer)相关联,也就是说standard input(STDIN), standard output(STDO 阅读全文
posted @ 2013-11-09 21:08 a ray of sunshine 阅读(550) 评论(0) 推荐(0) 编辑
摘要: 编译生成DLL文件的方法:方法一:1.cl /c FasterString.cpp ------->FasterString.obj2.lib /DEF FasterString.obj ------->FasterString.exp and FasterString.lib3.link /dll FasterString.exp FasterString.obj------ >FasterString.dll方法二:1.cl /c FasterString.cpp ------->FasterString.obj2.link /dll FasterString.ob 阅读全文
posted @ 2013-11-09 20:59 a ray of sunshine 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 1.(mov ecx,dword ptr [ebp-0Ch])将this指针压入ecx2.(mov edx,dword ptr [ecx])this指针指向该对象的首地址,而该处的前四个字节存放着该对象的虚函数表的首地址,将虚表指针放到edx中。3.(call dword ptr [edx+4])由于edx中存放着虚表指针,则edx+4表示调用该虚表中的第二个函数4.执行到上述操作后,执行该条指令(jmp B::say (00401320)),从而真正调用我们的虚函数! 如果我们的程序是通过指向对象的指针或者是引用来调用该对象的虚函数,则在调用虚函数的过程需要查表(虚函数表)来调用真正的函数。 阅读全文
posted @ 2013-11-09 20:35 a ray of sunshine 阅读(1676) 评论(0) 推荐(0) 编辑
摘要: 美国大学公开课:http://ocwconsortium.org斯坦福大学公开课:http://ocw.mit.eduMIT公开课:http://ocw.mit.edu公开课:http://Academicearth.orghttp://www.binarytides.comhttp://stackoverflow.com软件下载网站:(1) http://www.softpedia.com/(2) http://en.softonic.com/作者:u012348298 发表于2013-11-3 20:46:58 原文链接阅读:36 评论:0 查看评论 阅读全文
posted @ 2013-11-03 20:47 a ray of sunshine 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 1.中断和异常的概念以上定义摘自Intel官方文档80x86编程手册第三卷第五章Interupt and Exception Handling。从中可以看出中断来自外围设备(peripheral devices,这里指除了CPU)的通知(signals from hardware),而异常则是CPU在执行指令时遇到错误的条件(error condition, 我认为这里的错误的条件实际上就是错误的操作数(error operand)),所以说中断是由外围设备产生的,而异常是由CPU自身产生的(在执行指令时)。注意:上文中有这样一句话:Software can also generate int 阅读全文
posted @ 2013-10-19 20:36 a ray of sunshine 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 1. 系统处理异常的过程2. 系统执行全局展开的流程3. 关于编写函数时的错误处理方法4. C++异常和结构化异常(SEH)的比较注意上文中划红色线的语句,我们得出结论:C++异常机制是由SEH机制来实现的。 阅读全文
posted @ 2013-10-19 20:18 a ray of sunshine 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 1. try-finally 语句的基本形式__try{ //guarded code}__finally{ //termination handler}termination handler无论在guarded code以何种方式退出都会被调用。guarded code的退出方式有如下三种:a. 正常退出该代码块b. 在执行guarded code时发生异常c. 在执行guarded code时遇到return语句或者goto语句(无条件跳转)在这三种情况下termination handler都会被执行。其中第一种方式,常常用来对guarded code中申请的资源进行释放和清... 阅读全文
posted @ 2013-10-19 20:05 a ray of sunshine 阅读(199) 评论(0) 推荐(0) 编辑
摘要: SEH的应用Windows操作系统和C/C++编译器虽然对SHE(结果化异常处理)提供了很好的支持,但是Win32 API自身却并没有使用该机制来报告程序执行过程中出现的异常。Win32 API对异常的处理是这样的:当有异常发生时,该API函数就会返回一些特定的值来表示函数调用失败了,这些值有,NULL, INVALID_HANDLE_VALUE, FALSE等,同时该API函数会使用SetLastError函数来设置一个基于线程的变量,该变量表示最近一次发生异常时的错误码,我们的程序在调用的API函数之后如果发现函数调用失败(即函数返回上述值)可以调用GetLastError来获得该错误码, 阅读全文
posted @ 2013-10-19 19:40 a ray of sunshine 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 1. try-except语句的执行流程try-except语句的一般形式:__try{ //guarded section}__except(filter expression){ //exception handler}首先,明确几个术语,__try子句后面的复合语句被称作guarded section,__except子句括号中的表达式称为filter expression,__except子句后面的复合语句称为exception handler执行流程如下:(1)guarded section被执行(2)如果执行(1)时未发生异常,则直接执行exception handle... 阅读全文
posted @ 2013-10-19 19:29 a ray of sunshine 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 1. 在结构化异常处理中__try块和__except块是成对出现的,每一个__except块都必须有与之对应的__try块,不可能出现一个__try块下面有多于一个的__except块,如果这样就会出现编译错误,例如: __try { *presult = d1 / d2; } __except(GetExceptionCode() == EXCEPTION_STACK_OVERFLOW ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { ... 阅读全文
posted @ 2013-10-19 19:24 a ray of sunshine 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 对于模板函数和模板类来说,其参数类型也是被参数化的,如: template bool compare(const T v1, const T v2) { return v1 - v2; } 其中的参数v1和v2为T,只有在运行时(确切的说只有模板代码被编译时)才会确定,所以该文件不能被独立编译(将该模板函数单独编译到一个文件中如:compare.x)成一个目标文件(.obj文件)。因此 Mricosoft C++ 中 STL 库的模板类及模板方法只能以源文件的形式提供给用户(程序员)使... 阅读全文
posted @ 2013-10-19 19:08 a ray of sunshine 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 一 C++异常体系与Java异常体系 下图为c++标准库的异常类体系:其中的runtime_error类与java中的RuntimeException类有点类似,而logic_error与java中Exception类直接继承下来的异常类(除了RuntimeException)类似。Java中的RuntimeException类及其子类在编码时可以捕获也可以不捕获(由具体的业务逻辑决定),Exception类直接继承下来的异常类在编码时必须处理(要么捕获,要么再抛出)。而c++中的所有异常均可以捕获也可以不捕获(程序是可以编译通过的)。二 将Exception类型的异常转化成RuntimeEx 阅读全文
posted @ 2013-10-19 19:00 a ray of sunshine 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 1.exception与runtimeexception的区别exception由普通的代码抛出,而runtimeexception由系统(JVM)抛出,所以runtimeexception可以捕获也可以不捕获,而exception则必需处理,要么捕获(try...catch...),要么抛出,交给上一层代码处理。2.基于MVC的Web开发exception的处理倘若该层能够处理该异常,则处理,否则应该在你的代码中抛出一个exception,交由上一层处理,例如,处理文件下载时,Model层在进行文件读取时有可能遇到IOException,此时,在Model层是不应该也无法处理该excepti 阅读全文
posted @ 2013-10-19 18:41 a ray of sunshine 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 示例文件://保存为message.c文件#include INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow){ MessageBox(NULL, TEXT("Hello, World"), TEXT("test"), MB_OK); return 0;}方法一:编译和链接分开进行:① 打开Visual Studio命令行提示工具② cd到保存message.c的path下③ 编译源文件 cl /c /EHsc m 阅读全文
posted @ 2013-10-13 20:14 a ray of sunshine 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 字符串可以分配在栈,堆,和字符串常量区(静态数据区)中,这三种不同的内存结构具有不同的页(page)属性,这些属性决定了三种不同的字符串特性:1.在栈上分配字符串 在栈上分配字符串实质上又可以分成两种方法,具体方法如下所示: ① TCHAR str1[5] = {'H', 'e', 'l', 'l', 'o'};如图上图所示,它是语句①汇编后的代码,图中的红色方框一中的代码表示在栈上分配16个字节,红色方框二中的代码,将字符'H', 'e', 'l', 'l& 阅读全文
posted @ 2013-10-13 20:05 a ray of sunshine 阅读(723) 评论(0) 推荐(0) 编辑
摘要: (1) 用MIDL编写.idl文件//将以下代码保存成 IXIYIZ.idl 文件//在命令行上进行编译,编译命令://midl IXIYIZ.idl//生成 IXIYIZ.h ,dlldata.c, IXIYIZ.h, IXIYIZ_p.c//其中 IXIYIZ.h,IXIYIZ.h 文件是我们目前所需要的import "unknwn.idl";[ object, uuid(7F67119B-1E09-4d4f-B472-2106CCAE3275)]interface IX: IUnknown{ [local] void __stdcall Fx();};[ o... 阅读全文
posted @ 2013-10-13 19:47 a ray of sunshine 阅读(641) 评论(0) 推荐(0) 编辑
摘要: 1. Alertable I/O 的概念Alertable I/O 是异步I/O操作完成之后,对其结果进行处理的一种机制,为了理解Alertable I/O,读下面的文章(来自MSDN)Alertable I/O is the method by which application threads process asynchronous I/O requests only when they are in an alertable state.To understand when a thread is in an alertable state, consider the followin 阅读全文
posted @ 2013-10-13 19:28 a ray of sunshine 阅读(426) 评论(0) 推荐(0) 编辑
摘要: 版本一:对于使用“掩码”传递参数的方法,简单的实现思路:#include #define MB_OK 0x00000000#define MB_OKCANCEL 0x00000001 #define MB_ICONHAND 0x00000010#define MB_ICONQUESTION 0x00000020 #define MAX_RESULT 0xFFFFFFFF int MessageBox(const char *context, unsigned int type){ if(MAX_RESULT == (~MB_ICONHAND | type)) ... 阅读全文
posted @ 2013-10-12 15:26 a ray of sunshine 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 在Visual C++使用资源来创建对话框,菜单,以及一些自定义控件,实际是为了减少基于Win32 SDK编程开发人员在编写Application时创建大量窗口,和控件(实际上也是窗口)的痛苦(大量使用CreateWindow,还要设置其中的参数,有些参数,初始化显示位置X, Y,窗口(或控件)的宽度和高度等,使用CreateWindow来设置非常不直观,只能凭经验来设置合理的位置和大小)。 如下图所示,倘若我们用编程的方式来实现如下对话框,肯定是可以的但是太麻烦了,这个对话框有好多个控件和资源,如:菜单,组合框,文本输入框,按钮,同时还要设置这些控件自身的若干个性质,还有对话框本身的许多性. 阅读全文
posted @ 2013-10-12 15:17 a ray of sunshine 阅读(1044) 评论(0) 推荐(0) 编辑
摘要: 基于浏览器的WEB应用是典型的C/S应用,那么B/S(浏览器/服务器)应用的本质是什么,实际上就是网络中主机与主机的通信,说的更确切一些就是网络某个主机的进程与另一个主机的进程之间的通信,只不过这种主机进程之间的通信是跨网络的,主机进程之间通信常用的方法有Socket(套接字),使用Socket可以实现TCP(传输控制协议)和UDP(用户数据报协议)协议的通信方式,而这两种协议处于网络体系结构中的传输层,而传输层的主要功能或者说它能够向网络体系结构中上一层(应用层)提供的访服务是:运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。所以我们的应用可以直. 阅读全文
posted @ 2013-10-12 15:08 a ray of sunshine 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 一:使用JavaScript可以给HTML中的某些标签设置事件属性的处理器(Handle) 在现代浏览器中都内置有大量的事件处理器。这些处理器会监视特定的条件或用户行为,例如鼠标单击或浏览器窗口中完成加载某个图像。通过使用客户端的 JavaScript,可以将某些特定的事件处理器作为属性添加给特定的标签,并可以在事件发生时执行一个或多个 JavaScript 命令或函数。 标签的事件属性是有HTML规范所设定的,所以对于某个标签支持哪些事件属性,可以通过查阅该标签的事件属性列表来获得,例如,我们想在鼠标移动到某个超链接时,显示一个提示对话框,其内容是欢迎来到“该超链接所链接的网站”。如何解决这 阅读全文
posted @ 2013-10-12 15:01 a ray of sunshine 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 实例程序如下:// a.c// 编译指令:cl /c a.c ----> a.objint a;// b.cextern int a;int main(){ int b = a;}文件 b.c 编译后生成 b.obj 文件 ,extern 关键字表明整型变量(int) e 来自于外部的 .obj 文件或者.lib文件,所以为了正确得到该变量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正确得到 .obj 文件。以上为 b.obj 的汇编代码注意其中的符号 _e ,在对象文件 b.obj 文件进行连接时就是要根据符号 _e进行查找和定位,从而得到e的值。b.obj文件的汇编代 阅读全文
posted @ 2013-10-12 13:01 a ray of sunshine 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 1.导出函数的方法:(1)在要导出的函数签名(signature)上添加关键字__declspec(dllexport)例如:void __declspec(dllexport) _cdecl someFun(){ printf("Hello, World!\n");}使用这种方法导出的函数,函数的名称修饰,为默认的修饰方法:(1).1 若是从.c文件中导出则使用c语言的名称修饰规则,其规则与函数的调用约定相关:① _cdecl/__cdecl(c调用约定):要导出的函数名称是someFun,名称修饰后为:someFun,也即是说,在该调用约定下,原函数名称和修饰名称是相同 阅读全文
posted @ 2013-10-12 12:33 a ray of sunshine 阅读(310) 评论(0) 推荐(0) 编辑