Windows线程创建、退出及资源释放

可追溯本文的网址:

http://www.360doc.com/content/14/0218/12/7267612_353478380.shtml

http://blog.csdn.net/xwdpepsi/article/details/12375577

创建一个线程的几种方法

1、 CreateThread
2、 _beginthread
3、 _beginthreadex
4、 AfxBeginThread
--------------------------------------------------------------------------------------

1、CreateThread

函数原型
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  					SIZE_T dwStackSize, // initial stack size
  					LPTHREAD_START_ROUTINE lpStartAddress, // thread function
  					LPVOID lpParameter, // thread argument
  					DWORD dwCreationFlags, // creation option
  					LPDWORD lpThreadId // thread identifier);
参数
lpThreadAttributes
      指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
dwStackSize:
      设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress:
      指向线程函数的指针,必须以下列形式声明:
DWORD WINAPI ThreadProc(LPVOID lpParam); // 格式不正确将无法调用成功。
// 也可以直接调用void类型
// 但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如:(LPTHREAD_START_ROUTINE)MyVoid
// 然后在线程声明为:
void MyVoid()
{
	return;
}
lpParameter
      向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags 
      线程标志,可取值如下:
--------------------------------------------------------------------------------------
CREATE_SUSPENDED(0x00000004):
      创建一个挂起的线程,
NULL(0):
      表示创建后立即激活。
STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):
      dwStackSize参数指定初始保留堆栈的大小,否则,dwStackSize指定提交的大小。该标记值在Win 2000/NT and Win Me/98/95上不支持。
--------------------------------------------------------------------------------------
lpThreadId:
      保存新线程的id。
返回值
      函数成功,返回线程句柄;函数失败返回false。 若不想返回线程ID,设置值为NULL。
实例:
PMYDATA pData;

pData = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
if(pData == NULL)
    ExitProcess(2);
// Generate unique data for each thread.
pData->val1 = i;
pData->val2 = i+100;

HANDLE hThread = CreateThread(NULL,            // default security attributes
			                  0,               // use default stack size
			                  ThreadProc,      // thread function
			                  pData,           // argument to thread function
			                  0,               // use default creation flags
			                  &dwThreadId[i]); // returns the thread identifier
// Check the return value for success.
if (hThread == NULL)
{
	ExitProcess(i);
}

2、_beginthread

函数原型
uintptr_t _beginthread(void(*start_address)(void*),
			           unsigned stack_size,
			           void *arglist 
);
参数
start_address:
      新线程的起始地址 ,指向新线程调用的函数的起始地址
stack_size
      新线程的堆栈大小,可以为0
arglist 
      传递给线程的参数列表,无参数是为NULL 
返回值
      假如成功,函数将返回一个处理信息对这个新创建的线程。如果失败_beginthread将返回-1。
引用头文件
#include <process.h>
实例
m_hThreadHandle = HANDLE(_beginthread(CAppLog::LogProcThread, 0, this));

3、_beginthreadex

函数原型(MSDN)
unsigned long _beginthreadex(void *security, 
				             unsigned stack_size, 
                                             unsigned (__stdcall *start_address)(void*), 
				             void *arglist, 
				             unsigned initflag, 
				             unsigned *thrdaddr);
参数
security
      安全属性,NULL为默认安全属性
stack_size
      指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0
start_address
      指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)
arglist
      传递给线程的参数的指针,可以通过传入对象的指针,在线程函数中再转化为对应类的指针
initflag
      线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)
thrdaddr
      用于记录线程ID的地址
返回值
      与_beginthread()不同的是: _beginthread 返回-1表示失败, 而_beginthreadex()返回0表示失败!
引用头文件
#include <process.h>
实例:
HANDLE hThread;
hThread = (HANDLE)_beginthreadex(NULL, 0, &SIPVoIPLink::ReceivingThrd, (LPVOID)this, 0, &threadID );
if(hThread == NULL) return false;

4、AfxBeginThread

      这个看起来就直接了,MFC封装的函数。
      在MFC中, 用户界面线程工作者线程都是由AfxBeginThread创建的,MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和过程:

原型一( 用户界面线程
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,
  					             int nPriority,
  					             UINT nStackSize,
  					             DWORD dwCreateFlags,
  					             LPSECURITY_ATTRIBUTES lpSecurityAttrs)
参数
pThreadClass
      从CWinThread派生的RUNTIME_CLASS类;
nPriority
      指定线程优先级,如果为0,则与创建该线程的线程相同;
nStackSize
      指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
dwCreateFlags
      一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
lpSecurityAttrs
      表示线程的安全属性,NT下有用。
原型二(工作线程)
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
  				          LPVOID lParam,
  				          int nPriority = THREAD_PRIORITY_NORMAL,
  				          UINT nStackSize = 0,
  				          DWORD dwCreateFlags = 0,
  				          LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
 				          );//用于创建工作者线程
参数:
pfnThreadProc : 
      线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL;
pParam 
      传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.
nPriority 
      线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级.
nStackSize 
      指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈
dwCreateFlags 
      指定创建线程以后,线程有怎么样的标志.可以指定两个值:
--------------------------------------------------------------------------------------
CREATE_SUSPENDED 
      线程创建以后,会处于挂起状态,直到调用:ResumeThread
NULL(0) 
      创建线程后就开始运行.
--------------------------------------------------------------------------------------
lpSecurityAttrs 
      指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL,
返回值
      一个指向新线程的线程对象的指针

几种创建线程的区别

      其实windows只提供了一个创建线程的方法,就是CreateThread,后面三个函数都是由CreateThread间接得到。

1、_beginthread和_beginthreadex的区别

      首先我们看看这两个函数都干了什么:
uintptr_r __cdecl _beginthreadex(...)
{
    //为即将创建的线程分配一个数据结构_ptiddata ptd(per-thread data)
    //初始化这个数据结构,其中ptd->_thandle = (uintptr_t)(-1)
    //如果初始化失败,返回(uintptr_t)(0) [_beginthread返回-1]
    //用传进来的参数,调用CreateThread
    //如果创建成功返回CreateThread返回的代码
    //如果创建失败则释放ptd,并返回(uintptr_t)(0) [_beginthread返回-1,而CreateThread失败返回0,非-1]
}
      然后再看看这两个函数有什么不同
      (1) 参数列表不同, ex版本的参数和CreateThread差不多:
      (2) 二者在初始化ptd失败时返回的值不同
      (3)_beginthread的参数缺少安全描述符. 而且它是创建线程的时候先以挂起状态创建 (CreateThread会填充ptd->_thandle和ptd->_tid) 然后再ResumeThread。 _beginthread是根据传进来的参数创建线程
      (4)失败返回值不同,ex版本的与Windows API CreateThread返回值是一直的,这也是提倡使用后者的原因之一

2、CreateThread()、_beginthreadex()及、AfxBeginThread()

      CreateThread时Windows API接口函数, _beginthreadex函数是C/C++运行库提供的函数,从 _beginthreadex函数的源代码,可以看出它的主要动作是:增加了一个名为ptd的 _ptiddata的结构的处理,然后在调用CreateThread函数。_ptiddata是每个线程都拥有自己的专用的数据结构。 AfxBeginThread是MFC封装的启动线程的函数,里面包含了很多和MFC相关的启动信息,而且封装了一些常用的操作,使用起来也比较简便。而用另外两个函数就需要程序员对类型,安全性检查进行更多的思考!
----------------------------------------------------------------------------------------

线程退出方式

      1.线程函数返回
      2.线程通过调用ExitThread终止自己(自己调用)
      3.TerminateThread(本进程或其它进程的线程调用)
      4.包含线程的进程终止

      第一种是最完美的退出方式,应尽可能使用第一种方法以避免资源泄漏!
----------------------------------------------------------------------------------------

线程资源释放

      必须明白,一个线程终止和线程资源释放那个不是一个概念。当一个线程以上面几种退出方式终止之后,线程对象及资源还存在于内存中,所以在线程终止之后还需要某种方式释放资源。

      线程的释放方式与创建方式相关联:
      CreateThread创建的线程应使用CloseHandle关闭。
      _beginthread创建的线程应使用_endthread关闭。
      _beginthreadex创建的线程应使用_endthreadex关闭。
      AfxBeginThread 创建的线程,如果是线程自己结束自己的线程( 从CWinThread继承出来的 )就用AfxEndThread。如果外部调用的话可以用PostThreadMessage(m_nThreadID, WM_QUIT,0,0);给这个线程发送消息,线程就会结束的,其中的m_nThreadID是线程ID。

线程资源的释放方法(常用)

1、如果对创建线程的引用不感兴趣,可在创建之后直接关闭句柄

void main()
{
	……
	HANDLE hThread = CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);
	CloseHandle(hThread);
	……
}
      有些新手可能会有个疑问,为什么在刚创建完线程之后就把句柄关掉了?
      要特别注意句柄和实例区别,句柄只是对实例对象的引用,用以操作对象。我们使用CreateThread创建了一个线程实例(可将线程整体看作一个对象),返回的线程句柄只是提供了一个方法(类似于指针)让我们可以访问或操作线程对象。我们这里只需要让创建的线程执行必要的代码段就好了,之后并不需要在对其进行任何操作,所以可以直接将其CloseHandle掉,关闭句柄只是切断了访问线程的方式罢了,线程还是存在并运行着的。
      然而,只是这样解释还是有所偏差,因为在很多使用CloseHandle关闭其他对象句柄的操作中都会释放对象占用的资源,而对于线程,在调用CloseHandle之后并不会终止线程,也就不会立马释放线程资源(实现中线程还必须继续运行),调用CloseHandle之后系统会递减线程内核对象的使用计数,当线程执行完毕(线程函数执行完)之后也会递减此线程内核对象使用计数,当计数为0时才会释放线程资源!
反过来看,如果不使用CloseHandle关闭线程句柄,那么系统就会一直保持着对此线程内核对象的引用,这样,即使线程执行完毕,使用计数也不会为0,所以线程资源不会被释放。
      因此,CloseHandle关闭线程句柄是释放线程资源的必要途径,但不会影响线程的正常运行!所以CloseHandle的调用位置非常灵活,即可在线程刚创建出来之后紧接着调用,也可以在线程执行完之后才调用!

2、外部线程WaitForSingleObject,发现线程中止运行后,释放线程相关的资源

void main()
{
 	CThread thread; //一个自己定义的线程封装类,其中有一些成员变量,Start启动线程函数,Release释放资源函数。
 	thread.Start();
 	while(WaitForSingleObject(thread.m_hThread,1000) != WAIT_OBJECT_0)
	{
 		//TerminateThread(thread.m_hThread);//在这里如果你不想再等待,可以中止它
 		Sleep(1000);
 	}
 	thread.Release();
}
      这种方式的优点是对线程的全面的管理。
      缺陷在于,如果要即时释放资源,必须有一个专门的外部的线程来不断的监视或管理线程运行状态。

3、线程退出时将自身资源释放

DWORD CALLBACK CThread::Thread(VOID *pParam) //线程的入口函数,static函数
{
 	CThread *pthread = pParam;
 	... //工作状态设置
 	pthread->Execute()
 	... //工作状态设置
 	pthread->Release() //在所有的工作做完之后进行释放资源
 	return 0;
}
       这种方式的优点是对线程的资源的时机是最准确的,缺陷是必须要保证线程在需要退出时不会阻塞。

4、在实际的工作中,我们需要这多种方式的集合来实现我们的功能

      如有个网络服务器,它给每个用户的新建一个线程来响应它的请求,如果用户退出,要保证相关资源要完整的释 放,并且服务器本身有停止功能,停止时,不论有多少和用户交互,都必须中止所有线程,且释放所有资源。
      要解决的子问题:
      Q1:用户退出时资源释放:
      解决方式:
      (1)使用线程自身退出时释放的方式。
      (2)使用一个外部监视线程,发现线程退出时释放相应的资源。

      Q2:服务器停止时退出且释放所有线程
      设用户线程工作状态为停止, 等待用户线程自然退出,如果没有退出,可能是阻塞状态。这时使用强制退出的方法。
      释放所有用户线程相关的资源,可以根据资源的使用时间和方式(如某些Windows资源句柄), 在线程退出之前的某时机进行释放。

下面是我实作的满足以上要求的自身退出方式释放资源的线程类的代码片段:
int CThread::Stop()
{
 	m_RunningMutex.Lock(); //判断线程的工作状态,如果已经退出,直接返回
 	if(!m_bRunning)
 	{
  		m_RunningMutex.Unlock();
  		return ERR_VTHREAD_ALREAD_STOP;
 	}
 	m_RunningMutex.Unlock();

 	m_StopMutex.Lock();
 	m_bStop = True;  //设置线程的工作状态为停止
 	m_StopMutex.Unlock();
#ifdef _WIN32
 	DWORD ThreadId = GetCurrentThreadId(); //判断是否线程自身退出,如果是,则返回,不能调用强制退出的方法
#else
 	pthread_t ThreadId = pthread_self();
#endif
	 if(ThreadId != m_ThreadID)
 	{
 		m_dwExitMode = EXIT_BY_OTHER;
 	}
 	else
 	{
 		m_dwExitMode = EXIT_BY_SELF;
 	}

 if(m_dwExitMode == EXIT_BY_OTHER) //如果是服务器停止信号
 {
  	int nTryTime = 0;
  	bool bStopTry = false;
  	while( m_bRunning && !bStopTry) //尝试判断线程是否停止,最好使线程自然退出
  	{
   		if (nTryTime > m_nStopWaitTime) bStopTry = true;
   		Sleep(10000);
   		nTryTime ++;
  	}
  	if(bStopTry) //如果线程没有退出,就强制退出
#ifdef _WIN32
   		TerminateThread(m_hThread, DEF_EXIT_CODE);
#else
   		pthread_cancel(m_ThreadID);
#endif
  		m_RunningMutex.Lock();
  		m_bRunning = False;
  		m_RunningMutex.Unlock();

  		Release(); //线程已经停止,释放所有私有次源,这行代码可以在服务器端,让此函数只执行停止功能
 	}
 	return 0;
}
//这是线程的主函数,它包含的释放自身私有资源的功能。
#ifdef WIN32
DWORD __stdcall CThread::ThreadProc( VOID *lpParameter )
#else
VOID* CThread::ThreadProc( VOID *lpParameter )
#endif
{
 BOOL bStop;
#ifndef _WIN32
 	//pthread_detach(pthread_self());
#endif
 	CThread* pThread = (CThread*)lpParameter;

 	pThread->m_RunningMutex.Lock();
 	pThread->m_bRunning = True;
 	pThread->m_RunningMutex.Unlock();

 	pThread->m_StopMutex.Lock();
 	bStop = pThread->m_bStop;
 	pThread->m_StopMutex.Unlock();
 	if( !bStop)
 	{
  		pThread->Execute();
 	}
 	pThread->m_RunningMutex.Lock();
 	pThread->m_bRunning = False;
 	pThread->m_RunningMutex.Unlock();
 	if(pThread->m_dwExitMode == EXIT_BY_SELF) //在这里判断线程是否自身退出,如是:释放私有资源
 	{
  		pThread->Release();
	 }
	 //退出线程,使线程以最自然的方式退出.
 	return 0;
}

深入讨论几种创建线程的方式

      (1)使用 _beginthreadex 创建的线程就不该用CloseHandle释放, 因为,当用_beginThread来创建,而用CloseHandle来关闭线程时,这时复制的全局结构就不会被释放了,这就有了内存的泄漏。这就是很多资料所说的内存泄漏问题的真正的原因。

      (2)不要在一个MFC程序中使用_beginthreadex()或CreateThread()。这句话的意思是由于AfxBeginThread()是MFC封装的启动线程的函数,里面包含了很多和MFC相关的启动信息,而且封装了一些常用的操作,使用起来也比较简便。而用另外两个函数就需要程序员对类型,安全性检查进行更多的思考!

      (3)用_beginthreadex()函数应该是最佳选择,因为_beginthreadex()函数是CRun-timeLibrary中的函数,函数的参数和数据类型都是CRun-timeLibrary中的类型,这样在启动线程时就不需要进行Windows数据类型和CRun-timeLibrary中的数据类型之间的转化。减低了线程启动时的资源消耗和时间的消耗!

      (4)在C程序中,几乎都要用到new和delete,难道只有使用_beginthreadex()?不,因为MFC也是C类库(只不过是Microsoft的C类库,不是标准的C类库),在MFC中也封装了new和delete两中运算符,所以用到new和delete的地方不一定非要使用_beginthreadex()函数,用其他两个函数都可以!其实在程序中使用上面的哪个函数并不是绝对的,书的作者只不过是提了一个更佳的搭配方法,我在MFC程序中也经常使用_beginthreadex()和CreateThread()这两个函数,运行的效果也没有多大的区别,有的时候只是需要你额外的进行一些类型检查和其他的一些转化操作,其余没有其他不妥! 创建线程只有一个方法是::CreateThread()。_beginthreadex()、AfxBeginThread()等内部都是调用这个函数的,因为操作系统只提供这一个接口C静态库比WINDOWS出来还早,就别提多线程了,所以他对多线程的支持不是很好,但后悔也来不急,但也不能怪人家。

      (5)C运行库_beginthreadex()。他经过一些处理后,再调用CreateThread()如果要强制结束的话也最好用_endthreadex结束,因为他也要一些处理。 总结上面的内容,当然《Windows核心编程》上面得说法是比较权威的。所以,在对线程的结构、运行还不是很了解的时候最好还是按照书上的来。这样能够避免一些可能出现的莫名奇妙的错误,也省去的一些其他结构处理的考虑。当你清楚地知道线程的结构与运行机制,以及了解各个函数对CreateThread函数的封装的时候,大概那时候就能够应用自如了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 Windows应用程序开发入门..........................................................................................16 1.1 第一个实例程序............................................................................................................16 1.1.1 sta rt.exe..............................................................................................................16 1.1.2 Windows API......................................................................................................17 1.1.3 程序入口函数.....................................................................................................17 1.1.4 start.c代码分析...................................................................................................17 1.2 编译代码........................................................................................................................18 1.2.1 安装Visual Studio...............................................................................................18 1.2.2 安装Microsoft Platform SDK.............................................................................19 1.2.3 集成Microsoft Platform SDK与Visual C++速成版...........................................20 1.2.4 Vista SDK与Visual Studi0 2008.........................................................................21 1.2.5 Visual Studio专业版或团队系统版...................................................................22 1.2.6 使用图形化IDE建立工程、进行编译..............................................................22 1.2.7 “解决方案”与“工程”..........................................................................................23 1.2.8 使用命令行工具编译.........................................................................................23 第2章 Windows API概要..........................................................................................................24 2.1 Windows数据类型.........................................................................................................24 2.1.1 Windows数据类型示例......................................................................................25 2.1.2 Windows数据类型与标准C数据类型的关系...................................................28 2.1.3 Windows数据类型与Windows API...................................................................28 2.1.4 Windows中的数据结构......................................................................................29 2.2 Windows API的功能分类.............................................................................................29 2.2.1 系统基本服务.....................................................................................................29 2.2.2 系统管理.............................................................................................................31 2.2.3 用户界面.............................................................................................................31 2.2.4 图像和多媒体.....................................................................................................34 2.2.5 网络.....................................................................................................................34 2.2.6 系统安全.............................................................................................................34 2.2.7 其他功能.............................................................................................................35 2.3 Windows API核心DLL..................................................................................................35 2.3.1 Kerne132.dll........................................................................................................35 2.3.2 User32.dll............................................................................................................36 2.3.3 Gdi32.dll.............................................................................................................36 2.3.4 标准C函数..........................................................................................................36 2.3.5 其他Dll................................................................................................................36 2.4 Unicode和多字节..........................................................................................................36 2.4.1 W版本和A版本的API........................................................................................38 2.4.2 Unicode与ASGII的转换.....................................................................................39 2.5 对Windows程序设计规范的建议.................................................................................39 第3章开发工具配置与使用.....................................................................................................41 3.1 使用Visual C/C++编译链接工具...............................................................................41 3.1.1 编译器cl.exe.......................................................................................................41 3.1.2 资源编译器rc.exe...............................................................................................46 3.1.3 链接器link.exe....................................................................................................47 3.1.4 其他工具.............................................................................................................53 3.1.5 编译链接工具依赖的环境变量.........................................................................54 3.1.6 示例:使用/D选项进行条件编译.....................................................................57 3.2 使用Platform SDK.........................................................................................................58 3.2.1 Platform SDK的目录结构与功能......................................................................58 3.2.2 为编译链接工具设置环境变量.........................................................................59 3.2.3 Platform SDK工具集..........................................................................................61 3.2.4 Windows Vista SDK............................................................................................63 3.3 编写Makefile.................................................................................................................63 3.3.1 使用nmake.exe构建工程....................................................................................63 3.3.2 Makefile实例......................................................................................................65 3.3.3 注释.....................................................................................................................65 3.3.4 宏.........................................................................................................................66 3.3.5 描述块:目标、依赖项和命令.........................................................................68 3.3.6 makefile预处理...................................................................................................69 3.3.7 在Platform SDK的基础上使用nmake...............................................................70 3.4 使用WinDbg调试..........................................................................................................72 3.4.1 安装WinDbg.......................................................................................................72 3.4.2 编译可调试的程序.............................................................................................73 3.4.3 WinDbg命令.......................................................................................................74 3.4.4 调试过程演示.....................................................................................................74 3.5 集成开发环境Visual Studio..........................................................................................77 3.5.1 工程类型选择与配置.........................................................................................77 3.5.2 Visual Studio快捷方式.......................................................................................79 3.5.3 生成项目.............................................................................................................79 3.5.4 调试.....................................................................................................................79 3.5.5 选项与设置.........................................................................................................80 3.6 开发环境配置总结........................................................................................................81 第4章文件系统.........................................................................................................................82 4.1 概述...............................................................................................................................82 4.1.1 文件系统的基本概念.........................................................................................82 4.1.2 文件系统主要API..............................................................................................83 4.2 磁盘和驱动器管理........................................................................................................85 4.2.1 遍历卷并获取属性.............................................................................................85 4.2.2 操作驱动器挂载点.............................................................................................91 4.2.3 判断光驱中是否有光盘.....................................................................................96 4.2.4 获取磁盘分区的总容量、空闲容量、簇、扇区信息.....................................98 4.3 文件和目录管理..........................................................................................................101 4.3.1 删除、复制、重命名、移动文件...................................................................102 4.3.2 创建、打开、读写文件,获取文件大小.......................................................105 4.3.3 创建目录...........................................................................................................111 4.3.4 获取程序所在的目录、程序模块路径,获取和设置当前目录...................112 4.3.5 查找文件、遍历指定目录下的文件和子目录...............................................115 4.3.6 递归遍历目录树...............................................................................................118 4.3.7 获取、设置文件属性和时间...........................................................................120 4.4 内存映射文件..............................................................................................................125 4.4.1 使用Mapping File提高文件读写的效率.........................................................125 4.4.2 通过Mapping File在进程间传递和共享数据.................................................130 4.4.3 通过文件句柄获得文件路径...........................................................................133 4.5 总结..............................................................................................................................136 第5章内存管理.......................................................................................................................137 5.1 Windows内存管理原理...............................................................................................137 5.1.1 基本概念...........................................................................................................137 5.1.2 分页与分段内存管理、内存映射与地址转换...............................................138 5.1.3 进程的内存空间...............................................................................................140 5.1.4 虚拟内存布局、内存的分工、堆与栈...........................................................142 5.1.5 内存的保护属性和存取权限...........................................................................142 5.1.6 本章API列表....................................................................................................142 5.2 堆管理..........................................................................................................................144 5.2.1 获取堆句柄、分配与再分配堆.......................................................................144 5.2.2 获取堆中内存块的大小信息...........................................................................148 5.2.3 释放内存、销毁堆...........................................................................................149 5.3 全局(Global)和局部(Local)内存管理.........................................................................151 5.3.1 Global函数........................................................................................................151 5.3.2 Local函数........................................................................................................152 5.3.3 使用全局和局部函数分配和释放内存、改变内存块属性...........................153 5.4 虚拟内存管理..............................................................................................................154 5.4.1 虚拟地址空间与内存分页...............................................................................154 5.4.2 分配和释放可读可写的虚拟内存页面...........................................................154 5.4.3 修改内存页面状态和保护属性、将页面锁定在物理内存中.......................157 5.4.4 管理其他进程的虚拟内存...............................................................................158 5.5 内存操作与内存信息管理..........................................................................................159 5.5.1 复制充、移动、清零内存块、防止缓冲区溢出...........................................159 5.5.2 获得当前系统内存使用情况...........................................................................161 5.5.3 判断内存指针的可用性...................................................................................162 5.6 各种内存分配方式的关系与比较..............................................................................163 5.6.1 标准C内存管理函数Windows内存管理API的关系...................................163 5.6.2 功能性区别.......................................................................................................164 5.6.3 效率的区别.......................................................................................................164 第6章进程、线程和模块.......................................................................................................165 6.1 基本概念......................................................................................................................165 6.1.1 应用程序与进程...............................................................................................165 6.1.2 控制台应用程序与图形用户界面应用程序...................................................166 6.1.3 动态链接库、模块...........................................................................................166 6.1.4 线程、纤程与作业...........................................................................................167 6.1.5 权限与优先级...................................................................................................167 6.2 进程管理......................................................................................................................167 6.2.1 创建进程、获取进程相关信息、获取启动参数...........................................168 6.2.2 编写控制台程序和图形用户界面应用程序...................................................173 6.2.3 获取和设置环境变量.......................................................................................173 6.3 线程、纤程..................................................................................................................176 6.3.1 创建线程退出线程、获取线程信息...........................................................177 6.3.2 挂起、恢复、切换、终止线程.......................................................................179 6.3.3 创建远程线程、将代码注入其他进程中执行...............................................182 6.3.4 创建纤程、删除纤程、调度纤程...................................................................185 6.3.5 纤程与线程的互相转换...................................................................................186 6.4 进程状态信息..............................................................................................................191 6.4.1 PS API与Tool help API.....................................................................................191 6.4.2 遍历系统中的进程...........................................................................................193 6.4.3 列举进程的模块、线程...................................................................................197 6.4.4 进程的堆使用、内存占用、虚拟内存大小,页面错误情况.......................199 6.5 动态链接库..................................................................................................................200 6.5.1 加载、释放DLL、通过句柄获取DLL相关信息............................................201 6.5.2 编写动态链接库、导出函数...........................................................................201 6.5.3 创建动态链接库工程,配置DLL编译链接选项...........................................203 6.5.4 运行时动态获取DLL导出函数地址并调用...................................................204 6.5.5 声明导出函数创建lib库,为其他模块提供导入表调用接口...................205 6.5.6 通过构建导入表调用DLL导出函数...............................................................206 第7章线程同步.......................................................................................................................207 7.1 基本原理......................................................................................................................207 7.1.1 线程同步的过程...............................................................................................207 7.1.2 同步对象...........................................................................................................208 7.1.3 等待函数...........................................................................................................208 7.2 同步对象示例..............................................................................................................209 7.2.1 使用事件对象(Event).......................................................................................209 7.2.2 使用互斥对象(Mutex)......................................................................................214 7.2.3 使用信号量控制访问共享数据的线程数量...................................................217 7.2.4 使用可等待计时器(Timer)...............................................................................221 7.3 等待进程和线程执行完成......................................................................................224 第8章服务...............................................................................................................................225 8.1 基本概念......................................................................................................................225 8.1.1 服务控制器(SCM)............................................................................................225 8.1.2 服务程序...........................................................................................................226 8.1.3 服务控制管理程序...........................................................................................226 8.1.4 系统服务管理工具...........................................................................................226 8.1.5 服务的属性.......................................................................................................226 8.2 编写服务程序..............................................................................................................227 8.2.1 入口函数...........................................................................................................227 8.2.2 服务主函数.......................................................................................................227 8.2.3 控制处理函数...................................................................................................228 8.3 实现对服务的控制和管理..........................................................................................231 8.3.1 创建、删除服务...............................................................................................231 8.3.2 启动、停止服务,向服务发送控制请求.......................................................234 8.3.3 管理服务状态、配置服务、服务的依赖关系...............................................237 第9章图形用户界面...............................................................................................................244 9.1 字符界面程序..............................................................................................................244 9.1.1 基本概念...........................................................................................................244 9.1.2 控制台读写.......................................................................................................246 9.1.3 控制台字体、颜色等属性,操作屏幕缓存...................................................249 9.1.4 控制台事件.......................................................................................................259 9.2 图形用户界面:基本概念..........................................................................................262 9.2.1 窗口...................................................................................................................262 9.2.2 窗口类...............................................................................................................263 9.2.3 消息和消息处理函数.......................................................................................263 9.2.4 控件...................................................................................................................263 9.2.5 资源...................................................................................................................264 9.2.6 对话框...............................................................................................................264 9.3 图形用户界面:窗口..................................................................................................264 9.3.1 注册窗口类.......................................................................................................266 9.3.2 创建窗口...........................................................................................................267 9.3.3 窗口消息处理函数...........................................................................................269 9.3.4 窗口属性、位置和大小...................................................................................273 9.3.5 窗口显示方式...................................................................................................274 9.3.6.线程消息队列和消息循环...............................................................................274 9.4 图形用户界面:控件..................................................................................................275 9.4.1 Tree View控件..................................................................................................275 9.4.2 为Tree View控件增加节点..............................................................................277 9.4.3 Tree View右键菜单..........................................................................................278 9.4.4 List View控件...................................................................................................280 9.4.5 为List View控件增加分栏...............................................................................282 9.4.6 为List View控件增加项...................................................................................283 9.4.7 文本框控件.......................................................................................................284 9.4.8 为文本框控件设置文字...................................................................................285 9.5 界面资源......................................................................................................................286 9.5.1 资源脚本(.rc).................................................................................................286 9.5.2 资源ID定义和头文件.......................................................................................289 9.5.3 在程序中使用资源...........................................................................................289 9.6 菜单..............................................................................................................................290 9.6.1 菜单资源和菜单句柄.......................................................................................290 9.6.2 动态增加、删除、设置菜单及菜单项...........................................................291 9.6.3 菜单消息处理...................................................................................................292 9.7 对话框..........................................................................................................................292 9.7.1 创建对话框.......................................................................................................292 9.7.2 对话框消息处理函数.......................................................................................293 第10章系统信息的管理.........................................................................................................295 10.1 Windows系统信息.....................................................................................................295 10.1.1 获取系统版本.................................................................................................295 10.1.2 获取计算机硬件信息.....................................................................................297 10.1.3 获取系统目录等信息.....................................................................................299 10.1.4 用户名、计算机名、域名.............................................................................300 10.1.5 处理系统颜色信息、尺度信息等.................................................................302 10.1.6 鼠标、键盘等外设信息.................................................................................303 10.2 时间信息....................................................................................................................304 10.2.1 设置、获取系统时间.....................................................................................304 10.2.2 获取开机至现在持续的时间.........................................................................305 10.2.3 文件时间与系统时间的转换.........................................................................305 10.3 注册表........................................................................................................................306 10.3.1 注册表的作用及组织形式.............................................................................306 10.3.2 键、子键、键属性及键值的相关操作.........................................................307 10.3.3 列举注册表项及键值.....................................................................................309 10.3.5 设置随程序启动而启动的调试器(任何程序).........................................312 10.3.6 指定程序崩溃实时调试器.............................................................................312 第11章进程间通信.................................................................................................................313 11.1 邮槽( MailSlot ).........................................................................................................313 11.1.1 创建邮槽、从邮槽中读取消息.....................................................................313 11.1.2 通过邮槽发送消息.........................................................................................317 11.2 管道(Pipe)..................................................................................................................318 11.2.1 创建命名管道.................................................................................................318 11.2.2 管道监听.........................................................................................................320 11.2.3 使用异步I/O进行读写....................................................................................321 11.2.4 关闭管道实例.................................................................................................325 11.2.5 客户端.............................................................................................................325 11.3 剪贴板........................................................................................................................328 11.3.1 获取、设置剪贴板数据.................................................................................328 11.3.2 监视剪贴板.....................................................................................................334 11.3.3 剪贴板数据格式.............................................................................................343 11.4 数据复制消息(WM_COPYDATA)...........................................................................345 11.4.1 数据发送端.....................................................................................................345 11.4.2 数据接收端.....................................................................................................348 11.5 其他进程间通信方式................................................................................................350 11.5.1 动态数据交换(DDE)和网络动态数据交换(NDDE).....................................350 11.5.3 Windows Socket..............................................................................................351 第12章 Windows Shell程序设计............................................................................................352 12.1 Windows Shell目录管理...........................................................................................352 12.1.1 Shell对目录和文件的管理形式.....................................................................353 12.1.2 “我的文档”等特殊目录相关操作.................................................................353 12.1.3 绑定、遍历、属性获取.................................................................................354 12.1.4 浏览文件对话框.............................................................................................357 12.2 文件协助(File Associations)......................................................................................358 12.2.1 文件类型相关注册表键值.............................................................................359 12.2.2 为文件指定默认打开程序.............................................................................359 12.2.3 定制文件类型的图标.....................................................................................360 12.3 Shell扩展.................................................................................................................361 12.3.1 对象及概念.....................................................................................................361 12.3.2 CLSID,处理例程的GUID...........................................................................362 12.3.3 注册Shell扩展.................................................................................................363 12.3.4 COM程序开发基础........................................................................................364 12.3.5 编写Handler程序............................................................................................364 12.3.6 Shell扩展程序的调试.....................................................................................380 12.3.7 总结.................................................................................................................381 12.4 任务栏通知区域(Tray)图标......................................................................................381 12.4.1 创建图标窗口.................................................................................................382 12.4.2 创建图标和图标菜单.....................................................................................386 12.4.4 弹出气泡通知.................................................................................................391 12.4.5 动态图标.........................................................................................................393 12.4.6 其他功能.........................................................................................................395 第13章 Windows GDI.............................................................................................................398 13.1 GDI编程接口概述.....................................................................................................398 13.1.1 Windows GDI的功能......................................................................................398 13.1.2 链接库与头文件.............................................................................................398 13.2 设备上下文(DC)\输出操作与图形对象................................................................398 13.2.1 设备上下文类型与关联设备.........................................................................399 13.2.2 图形对象的作用及与DC的关系...................................................................399 13.2.3 各类图形对象的具体属性与作用.................................................................401 13.2.4 绘制、填充、写入等图形输出操作.............................................................402 13.2.5 修剪与坐标变换.............................................................................................403 13.2.6 设备上下文的图形模式.................................................................................403 13.3 一个最简单的GDI程序.............................................................................................404 13.3.1 示例.................................................................................................................404 13.3.2 DC的操作.....................................................................................................406 13.3.3 颜色的表示.....................................................................................................407 13.3.4 图形对象:画刷和画笔.................................................................................407 13.3.5 输出操作:绘制图形和线条.........................................................................409 13.4 文字和字体................................................................................................................409 13.4.1 选择、设置字体.............................................................................................412 13.4.2 选择字体图形对象.........................................................................................413 13.4.3 文字的颜色.....................................................................................................413 13.4.4 输出文字.........................................................................................................413 13.4.5 DC图形模式设置...........................................................................................414 13.4.6 遍历字体.........................................................................................................415 13.4.7 为系统安装、删除字体文件.........................................................................417 13.5 绘制线条....................................................................................................................417 13.5.1 选择画笔对象.................................................................................................417 13.5.2 直线.................................................................................................................418 13.5.3 绘制任意曲线.................................................................................................418 13.5.4 跟踪鼠标轨迹.................................................................................................418 13.5.5 弧线.................................................................................................................424 13.6 绘制图形....................................................................................................................424 13.6.1 填充颜色与边缘勾勒.....................................................................................425 13.6.2 绘制矩形、椭圆、圆角矩形.........................................................................425 13.6.3 椭圆弓形和椭圆扇形.....................................................................................431 13.6.4 多边形.............................................................................................................431 13.6.5 REGT结构及对RECT的操作........................................................................432 13.7 位图操作....................................................................................................................434 13.7.1 截取屏幕、保存位图文件.............................................................................434 13.7.2 将位图显示在界面上.....................................................................................439 13.8 区域(Regions)、路径(Paths)与修剪(Clip)操作.......................................................442 13.8.1 区域的创建及形状、位置等属性.................................................................442 13.8.2 区域边沿、区域填充、反转与勾勒操作.....................................................443 13.8.3 组合、比较、移动等操作.............................................................................446 13.8.4 点击测试(Hit Testing)....................................................................................447 13.8.5 路径的创建与操作.........................................................................................451 13.8.6 路径转换为区域.............................................................................................452 13.8.7 使用区域和路径进行修剪操作,限制输出.................................................452 13.9 坐标变换....................................................................................................................458 13.9.1 缩放.................................................................................................................459 13.9.2 旋转.................................................................................................................460 13.10 调色板......................................................................................................................460 第14章网络通信与配置.........................................................................................................463 14.1 Socket通信.................................................................................................................463 14.1.1 客户端.............................................................................................................464 14.1.2 服务端.............................................................................................................469 14.1.3 处理并发的客户端连接.................................................................................475 14.1.4 网络通信的异步I/O模式................................................................................476 14.2 IP Helper....................................................................................................................476 第15章程序安装与设置.........................................................................................................483 15.1.1 makecab.exe....................................................................................................483 15.1.2 压缩多个文件.................................................................................................484 15.1.3 Cabinet软件开发工具包(CABSDK)..............................................................485 15.2 编写INF文件.............................................................................................................486 15.2.1 INF文件格式..................................................................................................486 15.2.2 Install节...........................................................................................................488 15.2.3 CopyFiles和AddReg等安装过程...................................................................488 15.2.4 源路径和目的路径.........................................................................................489 15.2.5 字符串表.........................................................................................................489 15.3 安装程序setup.exe的编号.........................................................................................489 15.4 使用msi文件进行安装..............................................................................................493 15.4.1 Windows Installer Service...............................................................................493 15.4.2 msi文件的创建与修改工具orca.exe..............................................................495 15.4.3 准备工作.........................................................................................................496 15.4.4 编辑表组.........................................................................................................496 第16章设备驱动管理与内核通信.........................................................................................497 16.1 设备管理....................................................................................................................497 16.1.1 列举设备接口.................................................................................................497 16.1.2 监控设备的加载和卸载.................................................................................504 16.2 I/o控制、内核通信...................................................................................................509 16.2.1 加载驱动程序.................................................................................................509 16.2.2 控制驱动程序、与驱动程序进行通信.........................................................516 16.3 编写设备驱动程序....................................................................................................519 16.3.1 驱动程序开发包:DDK................................................................................520 16.4 I/O模式,同步与异步..............................................................................................525 第17章用户、认证和对象安全.............................................................................................527 17.1 基本概念....................................................................................................................527 17.1.1 访问令牌、权限和用户标识.........................................................................527 17.1.2 进程的系统操作权限.....................................................................................528 17.1.3 安全对象.........................................................................................................528 17.1.4 访问控制列表(ACL)......................................................................................529 17.2 安全机制程序示例....................................................................................................530 17.2.1 列举进程访问令牌内容和权限.....................................................................530 17.2.2 修改进程的权限.............................................................................................536 17.2.3 列举安全对象的安全描述符.........................................................................537 17.2.4 修改安全描述符.............................................................................................543 17.3 用户............................................................................................................................544 17.3.1 创建用户.........................................................................................................544 17.3.2 用户组.............................................................................................................545 17.3.3 删除用户.........................................................................................................546 17.3.4 列举用户和用户组、获取用户信息.............................................................547 第18章 Windows API的内部原理..........................................................................................554 18.1 关于API的补充说明.................................................................................................554 18.1.1 Windows API的版本演进和Vista新增API....................................................554 18.1.2 64位操作系统的接口..................................................................................555 18.2 Windows系统中的对象封装.....................................................................................555 18.2.1 什么是对象.....................................................................................................555 18.2.2 面向对象的思想.............................................................................................555 18.2.3 Windows系统中的对象:内核对象、GDI对象等.......................................556 18.3 WiFidows程序设计参考:文档资源与样例代码....................................................556 18.3.1 SDK文档和MSDN.........................................................................................556 18.3.2 SDK示例代码.................................................................................................556 18.4 x86平台程序函数调用原理.....................................................................................557 18.4.1 函数调用的真实过程.....................................................................................557 18.4.2 函数调用约定.................................................................................................561 18.4.3 为什么通过参数返回数据时只能使用指针.................................................562 18.4.4 缓冲区溢出.....................................................................................................562 18.4.5 程序运行错误的调试技巧.............................................................................562 18.5 可执行程序结构与AIPI函数接口内部机理............................................................563 18.5.1 Windows执行程序结构..............................................................................563 18.5.2 导入表、导出表、动态链接.........................................................................565 18.5.3 NTDLL.DLL、NATIVE API和SSDT............................................................566 18.5.4 API HOOK......................................................................................................568 18.6 发布程序....................................................................................................................569 18.6.1 合理选择编译链接选项.................................................................................569 18.6.2 构建到指定路径.............................................................................................569 18.7 模块化,向Windows APl学习接口定义..................................................................569 18.7.1 lib文件............................................................................................................569 18.7.2 头文件.............................................................................................................570 18.7.3 为第三方应用软件提供SDK.........................................................................570
Microsoft Windows 系统错误代码简单分析:   0000 操作已成功完成。   0001 错误的函数。   0002 系统找不到指定的文件。   0003 系统找不到指定的路径。   0004 系统无法打开文件。   0005 拒绝访问。   0006 句柄无效。   0007 存储区控制块已损坏。   0008 可用的存储区不足, 无法执行该命令。   0009 存储区控制块地址无效。   0010 环境错误。   0011 试图使用不正确的格式加载程序。   0012 访问代码无效。   0013 数据无效。   0014 可用的存储区不足,无法完成该操作。   0015 系统找不到指定的驱动器。   0016 无法删除该目录。   0017 系统无法将文件移到其他磁盘驱动器上。   0018 没有其他文件。   0019 媒体写保护。   0020 系统找不到指定的设备。   0021 设备尚未准备好。   0022 设备无法识别该命令。   0023 数据错误(循环冗余检查)。   0024 程序发出命令,但是该命令的长度错误。   0025 驱动器在磁盘上无法定位指定的区域或磁道。   0026 无法访问指定的磁盘或软盘。   0027 驱动器找不到所请求的扇区。   0028 打印机缺纸。   0029 系统无法写入指定的设备。   0030 系统无法读取指定的设备。   0031 与系统连接的设备不能正常运转。   0032 其他进程正使用该文件,因此现在无法访问。   0033 另一进程已锁定该文件的某一部分,因此现在无法访问。   0034 驱动器中的软盘不正确。请将 %2 (卷标序列号: %3)插入驱动器 %1。   0036 打开共享的文件太多。   0038 已到达文件结尾。   0039 磁盘已满。   0050 不支持此网络请求。   0051 远程计算机无法使用。   0052 网络中存在重名。   0053 找不到网络路径。   0054 网络正忙。   0055 指定的网络资源或设备已不可用。   0056 已经达到网络命令的极限。   0057 网络适配器出现错误。   0058 指定的服务器无法执行所请求的操作。   0059 网络出现意外错误。   0060 远程适配器不兼容。   0061 打印机队列已满。   0062 服务器上没有存储等待打印的文件的空间。   0063 已经删除等候打印的文件。   0064 指定的网络名无法使用。   0065 拒绝访问网络。   0066 网络资源类型错误。   0067 找不到网络名。   0068 已超过本地计算机网络适配器卡的名称极限。   0069 已超过网络 BIOS 会话的极限。   0070 远程服务器已经暂停或者正在启动过程中。   0071 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。   0072 指定的打印机或磁盘设备已经暂停。   0080 该文件存在。   0082 无法创建该目录或文件。   0083 INT 24 失败。   0084 处理该请求的存储区不可用。   0085 正在使用该本地设备名。   0086 指定的网络密码不正确。   0087 参数错误。   0088 网络出现写入错误。   0089 此时系统无法启动其他进程。 0100 无法创建其他系统标志。   0101 属于其他进程的专用标志。   0102 标志已经设置, 无法关闭。   0103 无法再次设置该标志。   0104 中断时无法请求专用标志。   0105 此标志先前的所有权已终止。   0106 请将软盘插入驱动器 %1。   0107 后续软盘尚未插入,程序停止。   0108 磁盘正在使用或已由其他进程锁定。   0109 管道已经结束。   0110 系统无法打开指定的设备或文件。   0111 文件名太长。   0112 磁盘空间不足。   0113 没有其他可用的内部文件标识符。   0114 目标内部文件标识符不正确。   0117 该应用程序所运行的 IOCTL 调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值