//我们进行Windows编程的时候,经常涉及到Windows服务编程,针对Windows服务我们该怎么编程呢,
//我们先来实现一个Windows服务并实现之,请见注释代码分析。
/* 头文件 */
#include <windows.h>
/* 全局变量 */
SERVICE_STATUS SplSrvServiceStatus;
SERVICE_STATUS_HANDLE SplSrvServiceStatusHandle;
/* 函数声明 */
VOID SvcDebugOut(LPSTR String, DWORD Status);
VOID WINAPI SplSrvServiceCtrlHandler (DWORD opcode);
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv);
DWORD SplSrvServiceInitialization (DWORD argc, LPTSTR *argv,
DWORD *specificError);
/*************************************
* VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv)
* 功能 服务启动函数
*
* 参数 未使用
**************************************/
VOID WINAPI SplSrvServiceStart (DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;
// 填充SERVICE_STATUS 结构
SplSrvServiceStatus.dwServiceType = SERVICE_WIN32;
SplSrvServiceStatus.dwCurrentState
= SERVICE_START_PENDING; // 服务在运行
SplSrvServiceStatus.dwControlsAccepted
= SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
SplSrvServiceStatus.dwWin32ExitCode = 0;
SplSrvServiceStatus.dwServiceSpecificExitCode = 0;
SplSrvServiceStatus.dwCheckPoint = 0;
SplSrvServiceStatus.dwWaitHint = 0;
// 注册服务控制请求处理例程
SplSrvServiceStatusHandle = RegisterServiceCtrlHandler(
"Sample_Srv", // 服务名,在创建服务时使用了
// SERVICE_WIN32_OWN_PROCESS,因此本参数被忽略。
SplSrvServiceCtrlHandler); // 控制请求处理例程,函数名
if (SplSrvServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
SvcDebugOut(" [SPLSRV_SERVICE] RegisterServiceCtrlHandler "
"failed %dn", GetLastError());
return;
}
// 初始化工作,本示例未使用,函数为空
status = SplSrvServiceInitialization(argc,argv, &specificError);
// 初始化出错,用户自行修改
if (status != NO_ERROR)
{
SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED;
SplSrvServiceStatus.dwCheckPoint = 0;
SplSrvServiceStatus.dwWaitHint = 0;
SplSrvServiceStatus.dwWin32ExitCode = status;
SplSrvServiceStatus.dwServiceSpecificExitCode = specificError;
SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus);
return;
}
// 初始化完成,设置运行状态
SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING;
SplSrvServiceStatus.dwCheckPoint = 0;
SplSrvServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ldn",status);
}
// 用户自行修改,用于完成服务的工作
SvcDebugOut(" [SPLSRV_SERVICE] Returning the Main Thread n",0);
return;
}
/*************************************
* DWORD SplSrvServiceInitialization(DWORD argc,
* LPTSTR *argv,
* DWORD *specificError)
* 功能 初始化,这里未进行任何工作,留待读者修改
*
* 参数
**************************************/
DWORD SplSrvServiceInitialization(DWORD argc,
LPTSTR *argv,
DWORD *specificError)
{
return(0);
}
/*************************************
* VOID WINAPI SplSrvServiceCtrlHandler (DWORD Opcode)
* 功能 服务控制请求的处理函数,与ControlService函数配合。
*
* 参数 服务控制码
**************************************/
VOID WINAPI SplSrvServiceCtrlHandler (DWORD Opcode)
{
DWORD status;
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
// 完成相关功能
SplSrvServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
// 完成相关功能
SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
// 完成相关功能
SplSrvServiceStatus.dwWin32ExitCode = 0;
SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED;
SplSrvServiceStatus.dwCheckPoint = 0;
SplSrvServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (SplSrvServiceStatusHandle,
&SplSrvServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ldn",
status);
}
SvcDebugOut(" [SPLSRV_SERVICE] Leaving SplSrvService n",0);
return;
case SERVICE_CONTROL_INTERROGATE:
// 收到此请求后发出声响,演示服务控制请求的处理过程,读者可自行修改
MessageBeep(MB_OK);
break;
default:
SvcDebugOut(" [SPLSRV_SERVICE] Unrecognized opcode %ldn",
Opcode);
}
// 当前状态
if (!SetServiceStatus (SplSrvServiceStatusHandle, &SplSrvServiceStatus))
{
status = GetLastError();
SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ldn",
status);
}
return;
}
/*************************************
* void main( )
* 功能 程序入口函数,注册服务启动函数等。
*
* 参数 服务控制码
**************************************/
void main( )
{
// 设置SERVICE_TABLE_ENTRY 数据结构,以NULL 结构结束,
// 作为StartServiceCtrlDispatcher 函数的参数。
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)n",
GetLastError());
}
}
/*************************************
* VOID SvcDebugOut(LPSTR String, DWORD Status)
* 功能 显示信息给调试器。
*
* 参数 LPSTR String 消息字符串
* DWORD Status 状态
**************************************/
VOID SvcDebugOut(LPSTR String, DWORD Status)
{
CHAR Buffer[1024];
if (strlen(String) < 1000)
{
wsprintf(Buffer, String, Status);
OutputDebugString(Buffer);
}
}
//具体实现代码如下,请见代码分析
**************************************/
/* 头文件 */
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
/* 全局变量 */
SC_HANDLE schService;
SC_HANDLE schSCManager;
LPTSTR szServiceName = TEXT("Sample_Srv");
/*************************************
* BOOL CreateSampleService(LPTSTR szPath, LPSTR szServiceName)
* 功能 创建服务
*
* 参数
* SC_HANDLE schSCManager,SCM句柄
* LPTSTR szPath, 服务程序的路径
* LPSTR szServiceName, 服务名
**************************************/
BOOL CreateSampleService(
SC_HANDLE schSCManager,
LPTSTR szPath,
LPSTR szServiceName)
{
// 创建服务
schService = CreateService(
schSCManager, // SCM 句柄
szServiceName, // 服务名
"Service sample", // 显示的服务名
SERVICE_ALL_ACCESS, // 存取权限
SERVICE_WIN32_OWN_PROCESS, // 服务类别
SERVICE_DEMAND_START, // 启动类别
SERVICE_ERROR_NORMAL, // 错误控制类别
szPath, // 服务的可执行文件路径
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
{
printf("CreateService failed (%d)n", GetLastError());
return FALSE;
}
else
{
printf("CreateService succeededn");
CloseServiceHandle(schService);
return TRUE;
}
}
/*************************************
* BOOL DeleteSampleService(LPTSTR szNameOfService)
* 功能 删除服务
*
* 参数 LPTSTR szNameOfService 服务的名字
**************************************/
BOOL DeleteSampleService(LPTSTR szNameOfService)
{
schService = OpenService(
schSCManager, // SCM 句柄
szNameOfService, // 服务名
DELETE); // 可删除
if (schService == NULL)
{
printf("OpenService failed (%d)n", GetLastError());
return FALSE;
}
// 删除服务
if (! DeleteService(schService) )
{
printf("DeleteService failed (%d)n", GetLastError());
return FALSE;
}
else
printf("DeleteService succeededn");
// 关闭句柄
CloseServiceHandle(schService);
return TRUE;
}
/*************************************
* void main( int argc, TCHAR *argv[] )
* 功能 演示
*
* 参数 未使用
**************************************/
void main( int argc, TCHAR *argv[] )
{
TCHAR szBinFilePath[MAX_PATH];
PTCHAR pTemp;
DWORD dwStopError;
// 构造服务可执行程序的路径
GetModuleFileName(NULL,szBinFilePath,MAX_PATH);
pTemp = szBinFilePath+lstrlen(szBinFilePath);
while(*--pTemp!='');
lstrcpy(pTemp,TEXT("SplSrv.exe"));
// 打开 SCM
schSCManager = OpenSCManager(
NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (NULL == schSCManager)
printf("OpenSCManager failed (%d)n", GetLastError());
// 创建服务
CreateSampleService(schSCManager, szBinFilePath, szServiceName);
// 启动服务
StartSampleService(schSCManager,szServiceName);
// 发送请求控制
ControlSampleService(SERVICE_CONTROL_INTERROGATE);
ControlSampleService(SERVICE_CONTROL_CONTINUE);
// 停止服务
dwStopError = StopService( schSCManager, szServiceName,
TRUE, 1000);
if(ERROR_SUCCESS == dwStopError)
{
printf("Service Stopedn");
}
else
{
printf("Service stoped error (%u)n",dwStopError);
}
// 删除服务
DeleteSampleService(szServiceName);
CloseServiceHandle(schSCManager);
}
//然后我们如何控制服务呢,我们来实现启动、停止服务,向服务发送请求。
/* 头文件 */
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
/* 全局变量 */
extern SC_HANDLE schService; // 在init.c中定义,下同
extern SC_HANDLE schSCManager;
extern LPTSTR szServiceName;
/*************************************
* BOOL StartSampleService(SC_HANDLE schSCManager,LPTSTR szServiceName)
* 功能 启动服务
*
* 参数 SC_HANDLE schSCManager SCM 句柄
* LPTSTR szServiceName 服务名
**************************************/
BOOL StartSampleService(SC_HANDLE schSCManager,LPTSTR szServiceName)
{
SC_HANDLE schService;
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;
DWORD dwBytesNeeded;
// 打开服务
schService = OpenService(
schSCManager, // SCM database
szServiceName, // service name
SERVICE_ALL_ACCESS);
if (schService == NULL)
{
return 0;
}
// 启动服务
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
printf("Service start error (%u).n",GetLastError());
return 0;
}
else
{
printf("Service start pending.n");
}
// 验证状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // info level
(LPBYTE)&ssStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // if buffer too small
{
return 0;
}
// tick count & checkpoint.
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
// 查询状态,确定 PENDING 状态结束
while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
// 等待一段时间
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 )
dwWaitTime = 1000;
else if ( dwWaitTime > 10000 )
dwWaitTime = 10000;
Sleep( dwWaitTime );
// 再次查询
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // info level
(LPBYTE)&ssStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // if buffer too small
break;
if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
// 进程创建中
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
{
// WaitHint 时间到
break;
}
}
}
// 关闭句柄
CloseServiceHandle(schService);
// 判断是否创建成功(状态由PENDING变为RUNNING)
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
{
printf("StartService SUCCESS.n");
return 1;
}
else
{
printf("nService not started. n");
printf(" Current State: %dn", ssStatus.dwCurrentState);
printf(" Exit Code: %dn", ssStatus.dwWin32ExitCode);
printf(" Service Specific Exit Code: %dn",
ssStatus.dwServiceSpecificExitCode);
printf(" Check Point: %dn", ssStatus.dwCheckPoint);
printf(" Wait Hint: %dn", ssStatus.dwWaitHint);
return 0;
}
}
/*************************************
* DWORD StopService( SC_HANDLE hSCM,
LPTSTR szServiceName,
BOOL fStopDependencies,
DWORD dwTimeout )
* 功能 停止服务
*
* 参数 SC_HANDLE hSCM SCM 句柄
* LPTSTR szServiceName 服务名
* BOOL fStopDependencies 是否结束依赖的服务
* DWORD dwTimeout 超时
**************************************/
DWORD StopService(SC_HANDLE hSCM,
LPTSTR szServiceName,
BOOL fStopDependencies,
DWORD dwTimeout )
{
SERVICE_STATUS_PROCESS ssp;
SERVICE_STATUS ss;
DWORD dwStartTime = GetTickCount();
DWORD dwBytesNeeded;
// 打开服务
SC_HANDLE hService = OpenService(
hSCM, // SCM 句柄
szServiceName, // 服务名
SERVICE_ALL_ACCESS);
// 查询状态,确定是否已经停止
if ( !QueryServiceStatusEx(
hService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
{
return GetLastError();
}
if ( ssp.dwCurrentState == SERVICE_STOPPED )
{
return ERROR_SUCCESS;
}
// 如果是 STOP_PENDING 状态,则只需等待
while ( ssp.dwCurrentState == SERVICE_STOP_PENDING )
{
Sleep( ssp.dwWaitHint );
// 循环查询,直到状态改变
if ( !QueryServiceStatusEx(
hService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
{
return GetLastError();
}
if ( ssp.dwCurrentState == SERVICE_STOPPED )
{
return ERROR_SUCCESS;
}
if ( GetTickCount() - dwStartTime > dwTimeout )
{
return ERROR_TIMEOUT;
}
}
// 先结束依赖服务
if ( fStopDependencies )
{
DWORD i;
DWORD dwBytesNeeded;
DWORD dwCount;
LPENUM_SERVICE_STATUS lpDependencies = NULL;
ENUM_SERVICE_STATUS ess;
SC_HANDLE hDepService;
// 使用 0 大小的 buf,获取buf的大小
// 如果 EnumDependentServices 直接返回成功,说明没有依赖服务
if ( !EnumDependentServices( hService, SERVICE_ACTIVE,
lpDependencies, 0, &dwBytesNeeded, &dwCount ) )
{
if ( GetLastError() != ERROR_MORE_DATA )
return GetLastError(); // Unexpected error
// 分配缓冲区存储依赖服务的数据
lpDependencies = (LPENUM_SERVICE_STATUS) HeapAlloc(
GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded );
if ( !lpDependencies )
return GetLastError();
__try {
// 获得依赖服务
if ( !EnumDependentServices( hService, SERVICE_ACTIVE,
lpDependencies, dwBytesNeeded, &dwBytesNeeded,
&dwCount ) )
return GetLastError();
for ( i = 0; i < dwCount; i++ )
{
ess = *(lpDependencies + i);
// 打开服务
hDepService = OpenService( hSCM, ess.lpServiceName,
SERVICE_STOP | SERVICE_QUERY_STATUS );
if ( !hDepService )
return GetLastError();
__try {
// 结束服务
if ( !ControlService( hDepService,
SERVICE_CONTROL_STOP,
&ss ) )
return GetLastError();
// 等待服务结束
while ( ss.dwCurrentState != SERVICE_STOPPED )
{
Sleep( ss.dwWaitHint );
if ( !QueryServiceStatusEx(
hDepService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
return GetLastError();
if ( ss.dwCurrentState == SERVICE_STOPPED )
break;
if ( GetTickCount() - dwStartTime > dwTimeout )
return ERROR_TIMEOUT;
}
}
__finally
{
// 关闭服务
CloseServiceHandle( hDepService );
}
}
}
__finally
{
// 释放内存
HeapFree( GetProcessHeap(), 0, lpDependencies );
}
}
}
// 所有的依赖服务已经结束,结束指定服务
if ( !ControlService( hService, SERVICE_CONTROL_STOP, &ss ) )
return GetLastError();
while ( ss.dwCurrentState != SERVICE_STOPPED )
{
Sleep( ss.dwWaitHint );
if ( !QueryServiceStatusEx(
hService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded ) )
return GetLastError();
if ( ss.dwCurrentState == SERVICE_STOPPED )
break;
if ( GetTickCount() - dwStartTime > dwTimeout )
return ERROR_TIMEOUT;
}
return ERROR_SUCCESS;
}
/*************************************
* BOOL ControlSampleService(DWORD fdwControl)
* 功能 向服务发送控制码
*
* 参数 DWORD fdwControl 控制码值
* SCM 句柄,服务名直接使用全局变量
**************************************/
BOOL ControlSampleService(DWORD fdwControl)
{
SERVICE_STATUS ssStatus;
DWORD fdwAccess;
DWORD dwStartTickCount, dwWaitTime;
// Access
switch (fdwControl)
{
case SERVICE_CONTROL_STOP:
fdwAccess = SERVICE_STOP;
break;
case SERVICE_CONTROL_PAUSE:
case SERVICE_CONTROL_CONTINUE:
fdwAccess = SERVICE_PAUSE_CONTINUE;
break;
case SERVICE_CONTROL_INTERROGATE:
fdwAccess = SERVICE_INTERROGATE;
break;
default:
fdwAccess = SERVICE_INTERROGATE;
}
// 打开服务
schService = OpenService(
schSCManager, // SCManager 句柄
szServiceName, // 服务名
fdwAccess); // 存取权限
if (schService == NULL)
{
printf("OpenService failed (%d)n", GetLastError());
return FALSE;
}
// 发送控制码
if (! ControlService(
schService, // 服务的句柄
fdwControl, // 控制码
&ssStatus) ) // 状态
{
printf("ControlService failed (%d)n", GetLastError());
return FALSE;
}
// 显示状态
printf("nStatus of Sample_Srv: n");
printf(" Service Type: 0x%xn", ssStatus.dwServiceType);
printf(" Current State: 0x%xn", ssStatus.dwCurrentState);
printf(" Controls Accepted: 0x%xn",
ssStatus.dwControlsAccepted);
printf(" Exit Code: %dn", ssStatus.dwWin32ExitCode);
printf(" Service Specific Exit Code: %dn",
ssStatus.dwServiceSpecificExitCode);
printf(" Check Point: %dn", ssStatus.dwCheckPoint);
printf(" Wait Hint: %dn", ssStatus.dwWaitHint);
return TRUE;
}
分享到:
相关推荐
Visual C++开发基于SNMP的网络管理软件 高清版本,带书签,其他的几十兆的根本没法看,太模糊了。太大了分了两个压缩包。另一个看我的资源。。
《精通Windows Sockets网络开发:基于Visual C++实现》是一本深入探讨网络编程技术的专著,主要聚焦于使用Microsoft的Visual C++编程环境来构建网络应用。Windows Sockets(通常简称为Winsock)是微软为Windows操作...
《精通Windows程序设计--基于Visual C++实现》是一本深入探讨Windows编程的书籍,通过使用Microsoft的Visual C++开发环境来讲解技术。这本书的核心在于帮助读者理解和掌握如何利用C++语言构建高效、稳定的Windows...
《精通Windows Sockets网络开发:基于Visual C++实现》是一本深入探讨网络编程技术的专业教材,专注于使用Windows Sockets API在Visual C++环境下构建网络应用。Windows Sockets,简称Winsock,是Microsoft Windows...
《精通Windows Sockets网络开发:基于Visual C++实现》是一本深入探讨Windows环境下使用Sockets进行网络编程的专业书籍。书中涵盖了使用Visual C++作为开发工具,实现高效、稳定的网络通信程序所需的关键技术与实践...
在IT领域,Visual C++是一种强大的编程环境,用于开发Windows平台的应用程序。它结合了C++语言的强大功能和Microsoft的Windows API,使开发者能够创建高效、高性能的应用程序。本篇文章将深入探讨Visual C++编程的...
### 基于Visual C++6.0的DLL编程实现 #### 一、概述 动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中的一种重要组件,它允许多个应用程序共享相同的函数和数据,从而提高了资源利用率并简化了...
本书《Visual C++ 6.0编程技巧与实例分析》旨在深入浅出地介绍Visual C++ 6.0的编程技巧,并通过具体的实例来分析,以便读者能更好地理解并掌握Visual C++编程的核心概念。 第一章介绍了Windows编程模式。在Windows...
《Visual C++网络高级编程》是一本专注于使用Microsoft的Visual C++进行网络编程的专业书籍,由陈坚和陈伟合著。这本书详细介绍了如何利用Visual C++开发高效、可靠的网络应用程序,涵盖了网络通信的各个方面,包括...
在本书中,你将学习如何安装和配置Visual Studio,设置C++项目,并理解IDE的基本操作。 在C++语言基础部分,书中会详细介绍C++语法,包括变量、数据类型、运算符、流程控制语句(如if-else,for,while等)、函数的...
通过阅读《Visual C++ MFC编程实例》这本书并实践源码,你可以逐步掌握如何利用MFC开发功能丰富的Windows应用程序,了解MFC的各个组件以及它们之间的协作关系。书中可能涵盖从基本的窗口创建、事件处理,到复杂的...
本文将深入探讨一个基于Visual C++的仓库管理系统源代码,它利用Microsoft Foundation Class (MFC)库来实现。MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发,它封装了Windows API,提供了面向对象的...
《Visual C++ MFC编程...总结,Visual C++ MFC是Windows平台上进行C++开发的重要工具,通过深入理解和实践MFC编程实例代码,开发者能够提升在Windows环境下的软件开发能力,为构建高效、稳定的桌面应用打下坚实基础。
在IT领域,网络编程是构建分布式系统和网络应用的核心技术之一。Visual C++作为Microsoft提供的一个强大的集成开发环境,支持创建高性能的应用程序,包括网络通信软件。本篇将详细探讨"Visual C++网络编程示例"所...
《Visual C++编程技巧精选集源代码》是一个包含丰富的编程示例资源的压缩包,专为深入学习和提升VC++编程技巧而设计。这个资源集合了超过1300个实例,涵盖了各种复杂的编程概念和技术,是开发者们自我提升、实践操作...
它的强大之处在于能够创建基于MFC(Microsoft Foundation Classes)的Windows应用程序,这是一个C++库,提供了对Windows API的封装,使得开发者可以更高效地编写代码。 Windows程序开发的核心概念包括窗口、消息...
《精通Visual C++.NET图像处理编程(第二版)》是一本深入探讨如何使用Microsoft的C++编程语言,结合.NET框架,进行高效图像处理的技术专著。本书主要关注于使用MFC(Microsoft Foundation Classes)库来实现图像处理...
《Windows核心编程(第五版)源码》是深入学习Windows操作系统编程的重要参考资料,结合Windows via C/C++ 5th edition这本书,提供了丰富的实践代码。这个压缩包中的源代码是作者精心设计的,旨在帮助读者理解并掌握...
《精通Windows Sockets网络开发——基于Visual C++实现》是一本深入探讨网络编程技术的书籍,专注于使用C++和Microsoft的Visual C++环境。源代码提供了丰富的实例,帮助读者掌握Socket编程的核心概念和技巧,同时也...