Windows资源处理器源码:Visual C++系统编程实现

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该项目是一个与Windows操作系统交互的源代码项目,使用Visual C++编写,意在实现一个类似Windows资源管理器的图形用户界面程序。它涉及系统编程的关键概念,包括进程与线程管理、内存管理、文件I/O、用户界面设计、事件驱动编程、异常处理和多线程编程。同时,也涵盖了Visual C++特有的知识点,如MFC、C++标准库以及使用Visual Studio IDE的调试和构建系统。开发者通过分析该项目代码,可以提升其在Windows平台上的系统编程及Visual C++开发能力。 windows_source_controller.rar_系统编程_Visual_C++_

1. Windows系统编程入门

1.1 Windows编程概述

在当今快速发展的IT行业中,Windows系统编程是软件开发领域的一个基础和重要的分支。作为开发者,深入了解并掌握Windows系统编程不仅是提升个人技术实力的体现,也是实现高效软件开发的关键。本章节旨在介绍Windows系统编程的基本概念,以及如何开始Windows编程的第一步。

1.2 开发环境搭建

Windows编程通常需要特定的开发环境和工具链。在开始编程前,安装一个稳定的开发环境至关重要。推荐使用Microsoft Visual Studio作为主要开发工具。它是一个功能强大的集成开发环境,集成了代码编辑、调试、性能分析等多种功能。安装过程中选择相应的C++开发组件,以及针对Windows平台的SDK和工具集,可以为接下来的编程活动打下坚实基础。

1.3 基础编程示例

一个简单的“Hello, World!”程序是初学者入门的最佳起点。以下是一个使用C++编写的Windows控制台应用程序的示例代码,该程序输出“Hello, World!”到控制台窗口:

#include <iostream>

int main()
{
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

在编写代码后,通过Visual Studio构建并运行程序。这个简单的示例程序虽然简短,但却是理解Windows系统编程后续更深层次概念的基石。

通过本章内容,初学者将从Windows系统编程的整体概念、开发环境搭建、基本编程技能等多方面获得入门知识,为深入学习奠定坚实基础。

2. 进程与线程管理

2.1 进程管理基础

进程是程序执行时的一个实例,是系统进行资源分配和调度的一个独立单位。理解进程的基本概念与结构是操作系统编程中的一个重要环节。

2.1.1 进程的概念与结构

进程由程序代码、数据、变量、执行状态和资源集合组成。每个进程拥有自己独立的地址空间、系统资源和安全权限。在Windows系统中,进程的结构由进程控制块(PCB)和一系列的系统对象组成。

进程控制块(PCB) 是操作系统管理进程的重要数据结构,它存储了进程的状态、优先级、进程ID、内存分配信息等关键信息。进程的地址空间可以进一步细分为代码段、数据段和堆栈段。

2.1.2 进程的创建与终止

创建进程通常通过调用API函数,例如在Windows中的 CreateProcess() 。该函数能够加载一个程序并创建一个进程实例。创建成功后,系统返回一个进程句柄,允许程序对进程进行更多的控制,如设置优先级、终止进程等。

进程的终止可以通过多种方式实现,例如调用 ExitProcess() API函数、父进程调用 TerminateProcess() 强制终止子进程或进程自然结束。当进程终止时,系统回收所有分配给该进程的资源,并从系统进程列表中移除该进程记录。

// 示例代码:使用CreateProcess创建进程
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

// 执行 cmd.exe
if (!CreateProcess(NULL,   // No module name (use command line)
    "cmd.exe",        // Command line
    NULL,            // Process handle not inheritable
    NULL,            // Thread handle not inheritable
    FALSE,           // Set handle inheritance to FALSE
    0,               // No creation flags
    NULL,            // Use parent's environment block
    NULL,            // Use parent's starting directory 
    &si,             // Pointer to STARTUPINFO structure
    &pi)             // Pointer to PROCESS_INFORMATION structure
) 
{
    printf("CreateProcess failed (%d).\n", GetLastError());
    return -1;
}

// 关闭进程和线程句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

2.2 线程管理原理

2.2.1 线程的基本概念

线程是进程中的一个执行单元,它是系统独立调度和分派CPU的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,但拥有自己的执行栈和程序计数器。

线程的优点 主要包括资源开销较小、能够提升程序的并发执行能力。线程之间的切换通常消耗较少的系统资源,能够提高应用程序的响应速度和吞吐量。

2.2.2 线程的同步与通信

在多线程环境下,线程的同步与通信是保证数据一致性和避免竞态条件的重要机制。Windows提供了多种线程同步对象,如互斥量(Mutex)、信号量(Semaphore)、事件(Event)和临界区(Critical Section)等。

  • 互斥量 :用于控制对共享资源的互斥访问,一次只能有一个线程获得控制。
  • 信号量 :允许多个线程同时访问资源,但有最大访问数的限制。
  • 事件 :用于通知线程某个事件的发生,可以实现线程间的协调和等待/通知机制。
  • 临界区 :当多个线程访问同一个资源时,临界区确保了同一时刻只有一个线程能够进入这个区域。
// 示例代码:使用临界区来保护共享资源
CRITICAL_SECTION cs;
int sharedResource = 0;

// 初始化临界区
InitializeCriticalSection(&cs);

// 进入临界区
EnterCriticalSection(&cs);
sharedResource++;  // 访问共享资源
LeaveCriticalSection(&cs); // 离开临界区

// 清理临界区
DeleteCriticalSection(&cs);

2.3 高级管理技巧

2.3.1 线程池的使用与优化

线程池是一种管理线程生命周期的机制,它可以有效减少线程的创建和销毁次数,降低资源消耗,提升程序性能。线程池通常包含一个或多个待命线程,当有任务需要执行时,线程池会从待命线程中分配一个线程来执行任务,执行完毕后线程返回待命状态。

在Windows系统中,可以通过 CreateThreadpool 函数创建线程池,通过 SubmitThreadpoolWork 提交任务到线程池执行。使用线程池时需要考虑任务的大小、线程池中线程的数量以及线程池的配置等,以达到最优的性能和资源利用率。

// 示例代码:使用线程池提交任务
VOID CALLBACK MyWorkCallback(PTP_WORK Work, PVOID Context, PTP_TIMER Timer)
{
    UNREFERENCED_PARAMETER(Work);
    UNREFERENCED_PARAMETER(Timer);

    // 执行任务内容
    printf("Work item callback function called.\n");
}

int main()
{
    // 创建线程池
    PTP_POOL tpPool = CreateThreadpool(NULL);
    if (tpPool == NULL)
    {
        printf("CreateThreadpool failed (%d).\n", GetLastError());
        return -1;
    }

    // 提交任务到线程池
    PTP_WORK tpWork = CreateThreadpoolWork(MyWorkCallback, NULL, NULL);
    if (tpWork == NULL)
    {
        printf("CreateThreadpoolWork failed (%d).\n", GetLastError());
        CloseThreadpool(tpPool);
        return -1;
    }

    SubmitThreadpoolWork(tpWork);
    // 等待任务执行完成
    WaitForThreadpoolWorkCallbacks(tpWork, TRUE);

    // 清理资源
    CloseThreadpoolWork(tpWork);
    CloseThreadpool(tpPool);

    return 0;
}
2.3.2 进程间通信(IPC)机制

进程间通信(IPC)机制允许不同进程之间交换信息和数据。Windows提供了多种IPC机制,包括管道(Pipes)、命名管道(Named Pipes)、共享内存、邮槽(Mailslots)和远程过程调用(RPC)等。

每种IPC机制都有其特定的应用场景和优缺点。例如,管道适用于父子进程间简单的数据传输,而命名管道适用于非关联进程间的复杂数据交换。选择合适的IPC机制能够有效提升程序的通信效率和系统资源的使用。

// 示例代码:命名管道的使用
HANDLE hPipe;

SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;

// 创建命名管道
hPipe = CreateNamedPipe(
    L"\\\\.\\pipe\\MyPipe",  // pipe name
    PIPE_ACCESS_OUTBOUND,    // write-only access
    PIPE_TYPE_MESSAGE |      // message-type pipe
    PIPE_WAIT,               // blocking mode
    1,                       // max. instances
    0,                       // output buffer size
    0,                       // input buffer size
    0,                       // client time-out
    &saAttr                  // security attributes
);

if (hPipe == INVALID_HANDLE_VALUE) 
{
    printf("CreateNamedPipe failed (%d).\n", GetLastError());
    return -1;
}

// 连接到管道
HANDLE hClient;

hClient = CreateFile(
    L"\\\\.\\pipe\\MyPipe",  // pipe name
    GENERIC_READ |           // read and write access
    GENERIC_WRITE,
    0,                       // no sharing
    NULL,                    // default security attributes
    OPEN_EXISTING,           // opens existing pipe
    0,                       // default attributes
    NULL                     // no template file
);

if (hClient == INVALID_HANDLE_VALUE) 
{
    printf("CreateFile failed (%d).\n", GetLastError());
    CloseHandle(hPipe);
    return -1;
}

// 等待客户端连接
ConnectNamedPipe(hPipe, NULL);

// 读写数据等操作...

通过上述的讨论和代码示例,我们可以看到进程和线程管理是Windows系统编程的核心组成部分,理解这些基础概念有助于开发出更加高效、稳定的系统级应用。

3. 内存管理实践

3.1 内存管理机制

3.1.1 虚拟内存与物理内存的映射

虚拟内存为应用程序提供了一个巨大的、连续的、私有的地址空间。在物理内存中,这个地址空间被分割成多个块,这些块被称为“页面”。当程序尝试访问这个地址空间的某一部分时,硬件和操作系统共同协作,将对应的页面从物理内存中加载进来。

理解虚拟内存到物理内存映射的关键在于页表。页表由操作系统维护,记录了虚拟地址和物理地址之间的映射关系。每当进程访问一个虚拟地址时,硬件的内存管理单元(MMU)会根据页表将虚拟地址转换为物理地址。

这一过程在现代计算机中是透明的,但开发者仍需理解内存分配、使用和回收对性能可能带来的影响。当物理内存不足时,操作系统会采用页面置换算法(如LRU,最近最少使用)将不常用的页面保存到磁盘上,这种机制被称为“交换”或“分页”。

3.1.2 堆内存与栈内存的区别与管理

在C++等编程语言中,内存管理主要涉及到两种类型的内存:堆内存(heap)和栈内存(stack)。

  • 栈内存:用于存储局部变量和函数调用的上下文。它具有自动管理机制,当函数调用返回时,栈内存会被自动释放。栈的空间有限,且访问速度快。
  • 堆内存:用于动态内存分配。在堆上分配的内存需要程序员手动管理,包括分配和释放。堆内存的分配和回收机制相对开销较大,且容易出现内存泄漏等问题。

理解这两种内存的不同应用场景和性能影响对于编写高性能的应用程序至关重要。一个常见的最佳实践是尽量使用栈内存,仅在必要时使用堆内存。

3.2 内存泄漏的检测与防范

3.2.1 常见的内存泄漏原因分析

内存泄漏是导致应用程序性能下降和稳定性问题的常见原因。常见内存泄漏原因包括:

  • 循环引用:两个或多个对象相互引用,导致它们都无法被释放。
  • 未释放的内存:在动态分配内存后忘记释放。
  • 资源未释放:使用资源(如文件句柄、网络连接)后未正确关闭。

为避免这些情况,开发者需要仔细设计程序结构,并使用智能指针等工具来自动管理内存。

3.2.2 内存泄漏检测工具的使用

检测内存泄漏的常用工具包括Valgrind、Visual Leak Detector等。这些工具能够跟踪内存分配和释放,帮助开发者发现内存使用中出现的异常。

以Valgrind为例,其使用步骤通常为:

  1. 编译时开启调试信息和关闭优化选项。
  2. 运行Valgrind,并指定要检测的应用程序。
  3. 分析Valgrind的报告,找出内存泄漏的具体位置。
valgrind --leak-check=full ./your_application

工具报告中会详细列出未释放的内存块,帮助开发者定位问题。

3.3 高级内存管理技术

3.3.1 内存映射文件的应用

内存映射文件是将文件内容映射到进程的地址空间中,使得文件内容可以像访问内存一样被访问和修改。这种方法对于处理大型文件非常有效,因为它减少了文件I/O操作的次数。

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

int fd = open("largefile", O_RDONLY);
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
// 文件内容现在可以从addr开始访问了
munmap(addr, size);
close(fd);

在上述代码中,文件“largefile”被映射到进程的地址空间中。对addr指针所指向内存的读写操作,实际上是在操作文件的内容。

3.3.2 分页与共享内存的实现

分页是一种内存管理技术,它将物理内存分割成固定大小的块,称为“页”。每个进程都有自己的虚拟地址空间,当访问这些地址时,会通过页表转换为实际的物理地址。

共享内存是两个或多个进程共享一块内存区域的技术。共享内存提供了最高级别的进程间通信(IPC)机制,允许数据在进程间直接读写。

int shm_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
void *shm_ptr = shmat(shm_id, NULL, 0);
// 其他进程可以附加同一个共享内存块
// 在所有进程使用完毕后,需要分离和删除共享内存
shmdt(shm_ptr);
shmctl(shm_id, IPC_RMID, NULL);

在上述代码中,shmget函数创建了一块共享内存,并返回了一个标识符。shmat函数将共享内存块附加到进程的地址空间中。其他进程可以通过相同的标识符附加到同一块共享内存,并进行读写操作。

在使用共享内存时,同步机制(如信号量)非常重要,以避免竞态条件和确保数据一致性。

4. 文件I/O操作深入

4.1 文件系统基础

4.1.1 文件和目录的操作

在Windows系统编程中,对文件和目录的操作是基础且必要的技能。一个文件系统是一组结构化的存储在非易失性存储设备上的文件,以及定义访问这些文件的方法。在这一小节中,我们将深入探讨文件和目录操作的相关概念和技术。

首先,文件是存储在磁盘上的数据集合,而目录(或文件夹)则是用来组织文件的结构。在Windows编程环境中,文件和目录的操作通常涉及到以下API:

  • CreateFile :用于创建或打开文件或目录。
  • CloseHandle :用于关闭之前打开的文件或目录句柄。
  • ReadFile WriteFile :分别用于读取和写入文件内容。
  • DeleteFile :用于删除一个文件。
  • CreateDirectory RemoveDirectory :分别用于创建和删除目录。
  • SetFileAttributes :用于设置文件的属性。
  • FindFirstFile FindNextFile :用于遍历目录中的文件。

对于目录操作,一个常见操作是在程序中动态创建或删除目录以管理临时文件或数据存储。

下面是一个简单的示例代码,演示如何使用 CreateDirectory API创建一个新的目录:

#include <windows.h>
#include <iostream>

int main() {
    // 尝试创建一个新的目录
    if (!CreateDirectory(L"example_directory", NULL)) {
        std::cerr << "Directory creation failed. Error: " << GetLastError() << std::endl;
    } else {
        std::cout << "Directory created successfully!" << std::endl;
    }
    return 0;
}

在上述示例代码中, CreateDirectory 函数尝试在当前工作目录下创建一个名为“example_directory”的目录。若创建失败,则会输出错误信息。

4.1.2 文件系统权限与安全性

文件权限是用来管理对文件和目录访问的机制,确保只有授权用户才能进行读取、写入或执行等操作。在Windows系统中,权限是由访问控制列表(ACLs)来定义的,它为每个文件和目录指定了哪些用户和组有权限访问它们,以及具体的访问权限。

权限的设置主要通过 SetACL 函数来完成,而权限的查询通常使用 GetFileSecurity 。在实际应用中,开发者需要了解以下几种权限:

  • GENERIC_READ :读权限。
  • GENERIC_WRITE :写权限。
  • GENERIC_EXECUTE :执行权限。
  • GENERIC_ALL :所有权限。

安全性还涉及文件加密和用户身份验证。在操作敏感数据时,确保数据传输和存储的安全性是至关重要的。可以利用 CreateFile 函数打开文件时采用安全属性来加密数据。

总结

在本节内容中,我们了解了如何执行基础的文件和目录操作,包括创建、删除、读取和写入文件,以及如何创建和管理目录。还探讨了文件系统的权限和安全性,以及如何应用它们来保护数据的完整性和机密性。文件和目录操作是许多Windows应用程序的基础,理解和掌握这些技术对于任何想要深入探索Windows编程的开发者来说都是至关重要的。

5. 用户界面设计与实现

5.1 Windows界面编程基础

Windows平台下的用户界面设计不仅仅是美观的问题,它直接关系到用户对软件的交互体验和使用效率。界面设计和实现的基础在于对控件的理解以及窗口创建与消息处理机制。

5.1.1 控件与窗口的创建

在Windows编程中,控件是构成窗口的基本元素。控件可以响应用户的操作,并提供与用户交互的界面。创建一个基本的窗口并添加控件的步骤如下:

  1. 初始化一个 WNDCLASS 结构体,指定窗口类的名称、窗口消息处理函数等属性。
  2. 调用 RegisterClass 函数注册窗口类。
  3. 使用 CreateWindow 函数创建窗口实例,并通过参数指定控件类型和位置。
  4. 在窗口的消息处理函数中,处理例如 WM_PAINT WM_COMMAND 等消息,来响应用户操作。
// 简单的窗口创建示例代码
#include <windows.h>

// 窗口过程函数声明
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {
    WNDCLASSW wc = {0};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&wc)) {
        return -1;
    }

    CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                  100, 100, 500, 500, NULL, NULL, NULL, NULL);

    MSG msg = {0};

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

// 窗口过程函数定义
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProcW(hWnd, msg, wp, lp);
    }
    return 0;
}

5.1.2 消息处理机制与事件驱动

Windows应用程序是基于消息驱动的,即应用程序的运行是通过响应各种消息来实现的,这些消息包括鼠标点击、按键、系统时间等。窗口过程函数是处理消息的中心,每个窗口都有一个关联的窗口过程函数,用来决定当消息到达时应该如何响应。

  • WM_DESTROY 消息在窗口即将销毁时发送,此时通常会发送 WM_QUIT 消息给消息循环,让应用程序退出。
  • WM_COMMAND 消息通常由菜单选择、按钮点击等操作触发,用于处理用户界面的命令事件。

开发者需要根据不同的消息类型,编写相应的处理代码,使得用户与窗口间的交互能得以实现。

5.2 用户体验优化策略

5.2.1 用户界面布局与风格设计

良好的用户体验始于界面布局与风格设计。界面布局需考虑元素间的空间关系,确保足够的空白区域以避免拥挤感。此外,风格设计应考虑一致性,让用户在使用过程中感觉自然、流畅。

  • 布局 :使用网格系统来组织元素,确保对齐和视觉平衡。以F形或Z形浏览模式设计布局,引导用户视线。
  • 风格 :选择清晰的字体和颜色方案,确保文本可读性。设计统一的图标风格和按钮样式,增加识别性。

5.2.2 响应式设计与交互增强

响应式设计不仅适用于网页,现代Windows应用程序也应支持不同尺寸和分辨率的显示设备。交互增强是提高用户满意度的关键。

  • 响应式设计 :使用动态布局调整控件大小和位置,确保在不同设备上均有良好的显示效果。
  • 交互增强 :添加鼠标悬停效果、动画过渡、快速反馈(如进度条或微动效)以提升用户体验。

5.3 高级界面技术

5.3.1 动画与视觉效果的应用

现代应用程序不仅在功能上竞争,还在视觉效果上进行创新。合适的动画效果能吸引用户注意力,使应用显得更活跃。

  • 使用 SetWindowRgn 函数实现不规则窗口。
  • 通过 AnimateWindow 函数创建窗口动画。
  • 利用 Comctl32.dll 中的控件支持各种视觉效果,如阴影、半透明等。

5.3.2 多媒体与富交互界面开发

多媒体元素的融入以及富交互设计可以极大提升用户体验,为此开发者需要利用更高级的界面技术。

  • 使用 DirectX OpenGL 进行游戏级别图形处理。
  • 利用 Windows Media Player 控件播放音频视频文件。
  • 通过 COM 接口集成第三方多媒体库,例如 FFmpeg ,为应用添加高级媒体处理能力。

以上章节内容旨在展示如何从基本的界面编程到用户体验优化,再到高级界面技术应用的逐步深入了解Windows平台下的用户界面设计与实现。掌握这些内容对于开发出既美观又功能强大的Windows应用程序至关重要。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该项目是一个与Windows操作系统交互的源代码项目,使用Visual C++编写,意在实现一个类似Windows资源管理器的图形用户界面程序。它涉及系统编程的关键概念,包括进程与线程管理、内存管理、文件I/O、用户界面设计、事件驱动编程、异常处理和多线程编程。同时,也涵盖了Visual C++特有的知识点,如MFC、C++标准库以及使用Visual Studio IDE的调试和构建系统。开发者通过分析该项目代码,可以提升其在Windows平台上的系统编程及Visual C++开发能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Windows 2000,原名Windows NT 5.0。它结合了Windows 98和Windows NT 4.0的很多优良的功能/性能与一身,超越了Windows NT的原来含义。   Windows 2000系列分成四个产品:Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows 2000 Datacenter Server。 Windows 2000 Professional 是一个商业用户的桌面操作系统,也适合移动用户,是Windows NT Workstation 4.0的升级。Windows 2000 Server和Advanced Server分别是Windows NT Server 4.0及其企业版的升级产品。Windows 2000 Datacenter Server是一个新的品种,主要通过OEM的方式销售,是,支持32个以上的CPU和64GB的内存,以及4个节点的集群服务。 Windows 2000平台包括了Windows 2000 Professional 和Windows 2000 Server前后台的集成,下面仅从五个方面简要地介绍一下它的新特性和新功能。   一、活动目录   Windows 2000 Server在Windows NT Server 4.0的基础上,进一步发展了“活动目录(Active Directory)”。活动目录是从一个数据存储开始的。它采用了类似Exchange Server的数据存储,称为:Extensible Storage Service (ESS)。其特点是不需要事先定义数据库的参数,可以做到动态地增长,性能非常优良。这个数据存储之上已建立索引的,可以方便快速地搜索和定位。活动目录的分区是“域(Domain)”,一个域可以存储上百万的对象。域之间还有层次关系,可以建立域树和域森林,无限地扩展。   在数据存储之上,微软建立了一个对象模型,以构成活动目录。这一对象模型对LDAP有纯粹的支持,还可以管理和修改Schema。Schema包括了在活动目录中的计算机、用户和打印机等所有对象的定义,其本身也是活动目录的内容之一,在整个域森林中是唯一的。通过修改Schema的工具,用户或开发人员可以自己定义特殊的类和属性,来创建所需要的对象和对象属性。   活动目录包括两个方面:一个目录和与目录相关的服务。目录是存储各种对象的一个物理上的容器;而目录服务是使目录中所有信息和资源发挥作用的服务。活动目录是一个分布式的目录服务。信息可以分散在多台不同的计算机上,保证快速访问和容错;同时不管用户从何处访问或信息处在何处,都对用户提供统一的视图。 活动目录充分体现了微软产品的“ICE”,即集成性(Integration),深入性(Comprehensive),和易用性(Ease of Use)等优点。活动目录是一个完全可扩展,可伸缩的目录服务,既能满足商业ISP的需要,又能满足企业内部网和外联网的需要 最近在网上游荡的时候发现msdos和windows 2000的原代码 ,不敢独享,所以分享给大家
[上一页 [下一页] 前言 Windows Driver Model(WDM)的根源可追溯到几年前一种叫做Windows for Workgroups 3.10的操作系统。那时候我们努力地支持无数不同的SCSI控制器,我长期地注意WindowsNT开发组创建的小端口驱动程序类型。不久就认识到重新构造必要的映象加载器(image loader)和小端口驱动程序需要的执行环境比把这些小端口驱动程序重写成某些VXD形式的驱动程序并调试完毕所花费的努力要少得多。 不幸的是,Windows from Workgroups 3.10已经停止发行带有SCSI小端口支持的版本,主要是由于象ASPI(高级SCSI编程接口)这样的外围问题。然而,跨Windowswindows NT操作系统共享同样的驱动程序执行映象的基础是适当的并且可以在win95中见到,它(win95)可以与NT共享SCSI和NDIS小端口驱动程序二进制代码。 共享驱动程序模式的潜在意义是重大的。驱动程序开发人员感兴趣的是支持双平台,共享驱动模式能降低开发和调试的一半开消。对微软来说,共享模式意味着更容易地从win9x迁移到Windows2000或这个平台的未来版本。对最终用户来说,大量不同种类的稳定驱动程序可以在这个家族中的所有成员之间通用。 下一个(逻辑)步骤是 The next logical step, then, was to create a driver model with the ability to share general purpose drivers across both platforms. But what form should it take? Three requirements were immediately obvious: it must be multiprocessor-capable, it must be processor-independent, and it must support Plug and Play (PnP). Fortunately, the Windows NT 4.0 driver model met the first two requirements, and it seemed clear that the next major release of Windows NT would support PnP as well. As a result, WDM can be considered a proper subset of what is now the Windows NT driver model. The potential benefits of a shared driver model can be realized today for many classes of devices, and choosing the WDM driver model will continue to pay dividends in the future. For example, a correctly written WDM driver requires only a recompile before functioning in an NT 64-bit environment prototype. WDM will continue to evolve as new platforms and device classes are supported. Future versions of Windows 9x and Windows 2000 will contain upwardly revised WDM execution environments. Fortunately, WDM is designed to be "backward compatible," meaning that WDM drivers written according to the Windows 2000 DDK and designed to work for the intended environment will continue to work in a subsequent WDM environments. There is a lot to WDM, and in this book Walter does an excellent job in offering an in-depth tour of every aspect as well as the philosophy of the Windows Driver Model. Forrest Foltz 微软公司Windows开发体系结构设计者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值