摘要:使用GetCurrentDirectory和SetCurrentDirectory可以获取程序的当前目录,使用GetModuleFileName可以获取模块的路径,如果以NULL为参数调用GetModuleFileName,将会返回当前模块的路径。如果在程序主模块(.exe)中获取当前模块路径,便可以从当前的路径中提取出程序运行时所在的路径。下面分别介绍:1)GetCurrentDirectory函数用于获取当前进程所在的目录:DWORD WINAPI GetCurrentDirectory( __in DWORD nBufferLength, //路径字符串缓冲区的大小(TCHAR为单位)/
阅读全文
摘要:StringCbCopy函数用于拷贝string,且提供了目标缓冲区的大小作为参数,防止缓冲区溢出等安全问题。这个函数可用于替换以下函数的使用:strcpy, wcscpy, _tcscpylstrcpyStrCpyStringCbCopy函数原型如下:HRESULT StringCbCopy( __out LPTSTR pszDest, //目标字符串缓冲区 __in size_t cbDest, //目标缓冲区大小(字节),这个值必须考虑pszSrc加上空结束符’/0’的大小; //最大运行的字节数是STRSAFE_MAX_CCH * sizeof(TCHAR) __in LPCTSTR
阅读全文
摘要:图形用户界面之---窗口:主函数一般是:/************************************************************************** WinMain* 功能:程序入口点,调用InitApplication,InitInstance,进行消息循环* 参数:hinstance---应用程序本次运行实例* hPrevInstance---应用程序之前的实例,始终为NULL* lpCmdLine---命令行参数* nCmdShow---窗口显示方式,如SW_SHOW* 返回值:失败返回FALSE***********************..
阅读全文
摘要:WM_COPYDATA是一个非常特殊的消息,此消息可能携带一个比较大的消息参数,而其他消息都只能携带两个固定大小的参数(WPARAM和LPARAM)。WM_COPYDATA的两个参数如下:wParam //发送或传递这个消息的窗口lParam //指向包含要发送的数据的COPYDATASTRUCT结构的指针在发送WM_COPYDATA消息时,WM_COPYDATA的wParam参数应该赋值为发送此消息的窗口,而lParam消息参数指向一个COPYDATASTRUCT结构类型的变量:typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; //可以
阅读全文
摘要:剪贴板是由系统定义的,并不属于任何一个特定的进程。系统中所有进程都可以访问和设置剪贴板。剪贴板最大的特点就是数据传输没有明确的目标,数据是被动访问的;剪贴板的内容可以被多次访问,直到新的数据写入。剪贴板是一种可供选择的进程间通信方式,但由于系统中任何一个进程都可以都可以无限制地访问剪贴板,因此,它是一种不可靠的通信方式。1)获取和设置剪贴板数据涉及到的API有:OpenClipboard、EmptyClipboard、SetClipboardData、GetClipboardData、CloseClipboard等。OpenClipboard用于打开剪贴板,获得剪贴板的句柄:BOOL WINA
阅读全文
摘要:邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠UDP数据传输协议。使用邮槽通信的进程分为客户端和服务端,邮槽由服务端创建,创建后,客户端可以通过邮槽名打开邮槽,在获得邮槽句柄后可以向邮槽写入消息。邮槽通信是单向的,只有服务端能从邮槽中读取消息,而客户端只能写入消息。消息是先进先出的。通过邮槽通信的数据可以是任意格式的,但为了保证邮槽在各种Windows平台下都能够正常工作,邮槽通信一条消息的长度不能大于424字节。邮槽除了在本机上进行进程间通信外,还可以在主机之间进行通信。实际上一个邮槽是驻留在内存中的一个Windows临时虚拟文件,利用Windows标准文件函数可以对邮槽写入或读取消
阅读全文
摘要:======================继承而来的非虚函数======================假设类Derive公有继承自类Base,且类Base定义了一个公有非虚成员函数func:class Base{public: void Func(); ...};class Derive : public Base{ ...}Derive de; //定义一个派生类对象Base *pb = &de; //得到一个指向de的Base指针pb->Func(); //通过指针调用Func()Derive *pd = &de; //得到一个指向de的Derive指针pd-&g
阅读全文
摘要:作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何东西。class ASCEShape{public: virtual void draw() const = 0; //纯虚函数,因此ASCEShape成为一个抽象类 virtual void error(const string& msg); //一般虚函数 int objectID() const; //非虚函数 ...};class ASCERectangle : public ASCEShape {...
阅读全文
摘要:构造函数能够初始化对象,而缺省构造函数(指没有参数的构造函数)则可以不利用任何在建立对象时的外部数据就能初始化对象。这带来正反两面的效果:正面效果是:一些行为特性与数字相仿的对象被初始化为空值或不确定值是合理的,还有例如链表、哈希表、图等数据结构也可以被初始化为空容器;反面效果是:对很多对象来说,不利用外部数据进行完全的初始化是不合理的,比如一个输入姓名的通讯录对象是没有意义的。理想情况下,无需任何数据就可以建立对象的类可以包含缺省构造函数,而需要初始数据来建立对象的类则不能包含缺省构造函数。但实际上必须考虑更多因素。当一个类没有缺省构造函数时,使用上会存在一些限制:考虑下面的类:class
阅读全文
摘要:数据库系统三级结构:数据库系统一般划分为三个抽象级:用户级、概念级、物理级。1)用户级数据库:对应于外模式。它是用户看到和使用的数据库,又称用户视图;用户级数据库主要由外部记录组成,不同用户视图可以互相重叠,用户的所有操作都是针对用户视图进行的;2)概念级数据库:对应于概念模式。它是数据库管理员看到和使用的数据库,又称DBA视图;和用户视图不同,一个数据库应用系统只存在一个DBA视图。概念级模式把用户视图有机结合成一个整体,综合平衡考虑所有用户的要求,实现数据的一致性,最大限度降低数据冗余,准确反映数据间的联系;3)物理级数据库:对应于内模式。它是最接近于物理存储的级,又称内部视图;物理级数据
阅读全文
摘要:驱动对象:每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。确切地说,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化。驱动对象的结构定义如下(wdm.h):typedef struct _DRIVER_OBJECT { //结构的类型和大小 CSHORT Type;CSHORT Size;//每个驱动程序会有一个或多个设备对象,其中,每个设备对象都有一个指针指向下一个驱动对象//最后一个设备对
阅读全文
摘要:内核编程与应用程序编程一个很重要的不同点在于:应用编程中,多数情况下只需考虑单线程就可以;在内核编程中,绝大多数情况下所写的代码都位于多线程环境中。获得当前“滴答数”:获得系统日前和时间往往是为了写日志,获得启动毫秒数则很适合用来做一个随机数的种子。有时也使用时间相关的函数来寻找程序的性能瓶颈。在Win32开发中,我们使用GetTickCount()函数来返回系统自启动之后经历的毫秒数。在驱动开发中,对应的函数是KeQueryTickCount():VOID KeQueryTickCount( OUT PLARGE_INTEGER TickCount );需要注意的是,返回到TickCount
阅读全文
摘要:系统线程:在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是:NTSTATUS PsCreateSystemThread(OUT PHANDLE ThreadHandle,IN ULONG DesiredAccess,IN POBJECT_ATTRIBUTES objectAttributes OPTIONAL,IN HANDLE ProcessHandle OPTIONAL,OUT PCLIENT_ID ClientId OPTIONAL,IN PKSTART_ROUTINE StartRoutine,IN PVOID StartContext)
阅读全文
摘要:Windows提供了一类API来读、写和管理磁盘文件。使用API函数读写文件时,首先要使用CreateFile函数创建文件对象,调用成功会返回文件句柄。我们以此句柄为参数调用ReadFile和WriteFile函数,进行实际的读写操作;最后调用CloseHandle函数关闭不再使用的文件对象句柄。1)打开和关闭文件:CreateFile是一个功能强大的函数,Windows下的底层设备几乎都由它打开。它可以创建或打开文件、目录、物理磁盘、控制台缓冲区、油槽或管道等:HANDLE CreateFile( LPCTSTR lpFileName, //要创建或打开的对象的名称 DWORD dwDesi
阅读全文
摘要:Windows服务(Services),是一些运行在WindowsNT、Windows2000和Windows XP等操作系统下用户环境以外的程序。它不同于一般的可执行程序,不需要系统登录便可以运行,以完成某些特定的功能。服务提供了管理能力,可以将后台程序转换成服务,然后就可以用命令或者在系统启动用户登录之前启动,并且也可以暂停、恢复和终止。服务信息在注册表中维护。为了能够在系统中正确运行,在创建一个服务时必须接受一些特殊的规则,最重要的一点是:必须在目标系统中安装并且注册该Service。此外,基于用户界面的Service是没有多大意义的,当然Service可以有用户界面,不过由于每一个Se
阅读全文
摘要:NGINX_HTTP_Push_Module是一个Nginx服务器模块,可以实现服务器端的长连接和推送(但是推送一次后会结束进程,尚未实现持续的推送)。http://pushmodule.slact.net可以下载该模块。如果已安装Nginx,需要重新编译安装Nginx,要用命令"./configure --add-module=/home/hfahe/ngnix_http_push_module"来配置,然后执行make和make install来安装Nginx。安装完成后,在Nginx配置文件的Server段里添加两个路径配置:location /publish { s
阅读全文
摘要:原文地址:什么造就一个伟大的站点Andrew B. King作品译者:蒋宇捷 转载请注明介绍伟大站点的本质特征是什么?当你访问一个站点并且稍事停留的时候,是什么让你留下?幽默感是有用的。华丽的外观也很好。但是那些基本的特征更难以捉摸。这篇文章将把伟大站点的基本特征拆分成一些可以简单遵守的拇指规则(指经验法则,一种可用于许多情况的有用的原则)。这些指导方针里的大多数似乎是网络上的稀缺物品,但却只是简单的常识。Netscape和IE为了互相竞争,提供的非常有诱惑力的、独有的页面布局和文字标记特性,吸引了许多站长用来提高网站的表现力。只是他们不得不在页脚写上“你必须使用Netscape或者IE来访问
阅读全文
摘要:周鸿祎湖北黄冈人。毕业于西安交大管理学院系统工程系,获硕士学位。3721创始人,2003年作价1.2亿美金卖给雅虎,之后出任雅虎中国总裁;05年离职,出任IDG合伙人;06年出任奇虎360董事长,目前360是中国最大安全和杀毒服务提供商,也是第二大客户端软件。投资的公司包括迅雷、 Discuz、火石游戏等等。方兴东中国博客教父。博客中国创始人 WEB2.0倡导者,方兴东,浙江义乌人,1987-1994年就读于西安交通大学,获工学学士、硕士学位,清华大学传播学博士。互联网实验室、博客中国(blogchina)和义乌全球网共同创始人兼董事长,出版《21世纪的书》、《IT史记》、《博客》、《起来——
阅读全文