转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如:class File {// unsigned int modified : 1; // 位域 (bit-field)};View Code 位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。 在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/16/90228.html偶然看到一道C++面试题:void foo(void) { unsigned int a = 6; int b = -20; (a+b>6)?puts(">6"):puts("6。 这道题主要考察两个东西。 1.隐式类型转换:int型变量转化成unsigned int, b成了正数. 2.负数的补码:计算机系统中的数值是以补码形式表示(存储)的。一、C++隐式类型转换 C++定义了... Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/17/90354.html这几天在学习COM组件技术,网上看了很多教程,发现有一些很基础的东西基本都没有涉及,下面我就结合网上的一些教程加上自己的体会来进行一些总结。 (1)COM组件是什么? COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所组成。再向深入了看,以C++为例,COM组件实际上就是一些实现了特定接口的类,而接口都是纯虚类。组件从接口派生而来。我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西: class IObject . Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/19/90516.html1 问题的引入 UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。 TCP/IP协 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90697.html1 进程与进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程. Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/24/91003.htmlC++当中常常需要一个全局唯一的对象实例,这时候,我们就会想到单件模式。如何实现这一模式?全局变量当然是一个简单可行的方法,然而,这太丑陋。嗯,其实,丑陋倒也罢了,最严重的是它将引诱程序员滥用全局变量,这将导致维护的灾难。 既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很好,而且足够简单。不过,天空中尚有一朵小小的乌云,让我们来看一看它是什么。 静态成员 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/24/91045.html在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步:线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。线程间的同步方 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/23/90940.html上文我们介绍了如何建立一个简单的多线程程序,多线程之间不可避免的需要进行通信。相比于进程间通信来说,线程间通信无疑是相对比较简单的。首先我们来看看最简单的方法,那就是使用全局变量(静态变量也可以)来进行通信,由于属于同一个进程的各个线程是处于同一个进程空间中的,并且它们共享这个进程的各种资源,因此它们都可以毫无障碍的访问这个进程中的全局变量。当需要有多个线程来访问一个全局变量时,通常我们会在这个全局变量前加上volatile声明,来告诉编译器这个全局变量是易变的,让 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/23/90904.html线程,是在进程内部又细分的一个执行单元,他们都是由操作系统来进行划分控制的。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。(在物理内存中,多进程载入DLL时,DLL的代码段实际上是只加载了一次,只 Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90663.html前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小异,废话就不多说了,下面给个简单例子示范一下,也就不多做解释了。DLL头文件: #ifndef _DLL_SAMPLE_H#define _DLL_SAMPLE_H// 通过宏来控制是导入还是导出#ifdef _DLL_SAMPLE#define DLL_SAMPLE_API __declspec(dllexport)#else#define DLL_SAMPLE_API __declspec(dl Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90643.html前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从DLL中导出变量来。声明为导出变量时,同样有两种方法: 第一种是用__declspec进行导出声明#ifndef _DLL_SAMPLE_H#define _DLL_SAMPLE_H// 如果定义了C++编译器,那么声明为C链接方式#ifdef __cplusplusextern "C" {#endif// 通过宏来控制是导入还是导出#ifdef _DLL_SAMPLE#define DLL Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90621.html上文我简单的介绍了如何建立一个简单DLL,下面再我简单的介绍一下如何使用一个DLL。当一个DLL被生成后,它创建了一个.dll文件和一个.lib文件;这两个都是你需要的。要使用DLL,就需要载入这个DLL。隐式链接这里有两个方法来载入一个DLL;一个方法是捷径另一个则相比要复杂些。捷径是只链接到你.lib 文件并将.dll文件置入你的新项目的路径中去。因此,创建一个新的空的Win32控制台项目并添加一个源文件。将你做的DLL放入你的新项目相同的目录下。#includ Read More
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90619.html初学DLL,结合教程,总结一下自己的所得,希望对DLL初学者们有所帮助。 动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法同只把函数储存在已编译的OBJ文件中相比更有利于代码的重用。但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理 Read More