2006年08月29日
比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。

  Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。

  一般来说,DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。

  在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。

  DLL现在越来越容易编写。Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。

  一、导出和导入函数的匹配

  DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。

  简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。这样,一个特殊的DLL可以既有导入函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。

  在DLL代码中,必须像下面这样明确声明导出函数:

__declspec(dllexport) int MyFunction(int n);

  但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在应用程序方面,要求像下面这样明确声明相应的输入函数:

__declspec(dllimport) int MyFuncition(int n);

  仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。

  二、与DLL模块建立链接

  应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。

  采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。

  显式链接方式对于集成化的开发语言(例如VB)比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用Win32 的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。假设有一个导出如下函数的DLL文件:

extern "C" __declspec(dllexport) double SquareRoot(double d);

  下面是应用程序对该导出函数的显式链接的例子:

typedef double(SQRTPROC)(double);
HINSTANCE hInstance;
SQRTPROC* pFunction;
VERIFY(hInstance=::LoadLibrary("c:\\winnt\\system32\\mydll.dll"));
VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,"SquareRoot"));
double d=(*pFunction)(81.0);//调用该DLL函数

  在隐式链接方式中,所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中;但如果采用显式链接方式,程序员可以决定DLL文件何时加载或不加载。显式链接在运行时决定加载哪个DLL文件。例如,可以将一个带有字符串资源的DLL模块以英语加载,而另一个以西班牙语加载。应用程序在用户选择了合适的语种后再加载与之对应的DLL文件。

  三、使用符号名链接与标识号链接

  在Win16环境中,符号名链接效率较低,所有那时标识号链接是主要的链接方式。在Win32环境中,符号名链接的效率得到了改善。Microsoft现在推荐使用符号名链接。但在MFC库中的DLL版本仍然采用的是标识号链接。一个典型的MFC程序可能会链接到数百个MFC DLL函数上。采用标识号链接的应用程序的EXE文件体相对较小,因为它不必包含导入函数的长字符串符号名。

  四、编写DllMain函数

  DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。下面是一个框架DLLMain函数的例子。

HINSTANCE g_hInstance;
extern "C" int APIENTRY DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
{
if(dwReason==DLL_PROCESS_ATTACH)
{
TRACE0("EX22A.DLL Initializing!\n");
//在这里进行初始化
}
else if(dwReason=DLL_PROCESS_DETACH)
{
TRACE0("EX22A.DLL Terminating!\n");
//在这里进行清除工作
}
return 1;//成功
}

  如果程序员没有为DLL模块编写一个DLLMain函数,系统会从其它运行库中引入一个不做任何操作的缺省DLLMain函数版本。在单个线程启动和终止时,DLLMain函数也被调用。正如由dwReason参数所表明的那样。

  五、模块句柄

  进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识。进程自己还有一个HINSTANCE句柄。所有这些模块句柄都只有在特定的进程内部有效,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,这个两种类型可以替换使用。进程模块句柄几乎总是等于0×400000,而DLL模块的加载地址的缺省句柄是0×10000000。如果程序同时使用了几个DLL模块,每一个都会有不同的HINSTANCE值。这是因为在创建DLL文件时指定了不同的基地址,或者是因为加载程序对DLL代码进行了重定位。
模块句柄对于加载资源特别重要。Win32 的FindResource函数中带有一个HINSTANCE参数。EXE和DLL都有其自己的资源。如果应用程序需要来自于DLL的资源,就将此参数指定为DLL的模块句柄。如果需要EXE文件中包含的资源,就指定EXE的模块句柄。

  但是在使用这些句柄之前存在一个问题,你怎样得到它们呢?如果需要得到EXE模块句柄,调用带有Null参数的Win32函数GetModuleHandle;如果需要DLL模块句柄,就调用以DLL文件名为参数的Win32函数GetModuleHandle。

  六、应用程序怎样找到DLL文件

  如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:

  1. 包含EXE文件的目录,
  2. 进程的当前工作目录,
  3. Windows系统目录,
  4. Windows目录,
  5. 列在Path环境变量中的一系列目录。

  这里有一个很容易发生错误的陷阱。如果你使用VC++进行项目开发,并且为DLL模块专门创建了一个项目,然后将生成的DLL文件拷贝到系统目录下,从应用程序中调用DLL模块。到目前为止,一切正常。接下来对DLL模块做了一些修改后重新生成了新的DLL文件,但你忘记将新的DLL文件拷贝到系统目录下。下一次当你运行应用程序时,它仍加载了老版本的DLL文件,这可要当心!

  七、调试DLL程序

  Microsoft 的VC++是开发和测试DLL的有效工具,只需从DLL项目中运行调试程序即可。当你第一次这样操作时,调试程序会向你询问EXE文件的路径。此后每次在调试程序中运行DLL时,调试程序会自动加载该EXE文件。然后该EXE文件用上面的搜索序列发现DLL文件,这意味着你必须设置Path环境变量让其包含DLL文件的磁盘路径,或者也可以将DLL文件拷贝到搜索序列中的目录路径下。

关于文档视图关系的整理

、应用程序对象有一个文档模板管理器CDocManager* m_pDocManager
   (第一次调用AddDocTemplate时new出来)

2、文档模板管理器有一个文档模板对象列表CPtrList m_templateList
   (AddDocTemplate 函数负责添加该列表)

3、文档模板对象拥有文档、视图、框架的静态CRuntimeClass成员指针
   用于动态创建,还有一个m_nIDResource用来表示应采用的UI对象

4、每个文档模板对象拥有 m_pOnlyDoc 或 m_docList (文档指针或文档指针列表)
   OnFileNew 和 OnFileOpen都调用文档模板对象的OpenDocumentFile
   OpenDocumentFile 调用文档模板的 CreateNewDocument
   CreateNewDocument再调用文档模板的 AddDocument 填充该文档列表或文档指针

5、文档对象有一个文档模板指针 m_pDocTemplate (回指文档对象所属模板对象)
   同上,也是文档模板的 AddDocument 成员函数把 this 指针(文档模板自身)
   塞给刚刚创建的文档对象

6、文档对象有一个 m_viewList(视图列表)
   OnFileNew 和 OnFileOpen 都调用文档模板对象的OpenDocumentFile
   该函数调用 CreateNewDocument 创建文档
   然后调用 CreateNewFrame 创建框架对象
   CreateNewFrame 构造CCreateContext对象
   CCreateContext两个重要字段:(1)刚创建的文档指针(2)视图的CRuntimeClass指针

   CreateNewFrame 创建框架对象后由该对象调用 LoadFrame
   LoadFrame 的最后一个参数即为 CCreateContext 指针
   LoadFrame 调用 Create,Create 再调用 CreateEx 最后一个参数均为此CCreateCon
text指针
   Create的调用由消息映射表引发CFrameWnd::OnCreate被调用
   OnCreate的LPCREATESTRUCT的一个字段lpCreateParams 仍然是这个CCreateContext
指针
   则在CFrame::OnCreate中,由这个CCreateContext的CRuntimeClass(视图的)来调用C
reateObject
   产生视图对象后,由该对象调用Create(最后一个参数仍然是这个CCreateContext指针
)
   视图对象的Create由消息映射表引发视图对象的OnCreate被调用
   视图的OnCreate的参数 LPCREATESTRUCT 的 lpCreateParams 还是这个CCreateCont
ext指针)
   于是利用 CCreateContext 的成员 m_pCurrentDoc (当前文档)
   来调用 CDocument::AddView 把视图加入文档的视图列表

7、视图有一个文档指针m_pDocument (指向所属文档)
   同上,也是CDocument::AddView函数初始化的,如下所示:
   pView->m_pDocument = this;

8、框架有一个m_pViewActive(活动视图)
   由框架的SetActiveView进行设置

 
CWinApp中有一个CDocManager对象指针  m_pDocManager
(第一次调用AddDocTemplate时new出来)
CDocManager有一个指针链表 CPtrList m_templateList
用来保存一系列文档模板
文档模板有三个成员变量
CRuntimeClass* m_pDocClass
CRuntimeClass* m_pFrameClass
CRuntimeClass* m_pViewClass   //用于动态创建对象
CSingleDocTemplate有一个文档指针m_pOnlyDoc
CMultiDocTemplate有一个文档指针列表 CPtrList m_docList  //用来保存一系列文档
文档有一个成员CDocTemplate* m_pDocTemplate 指向其文档模板
文档还有一个CPtrList m_viewList用来保存其对应的一系列视图
视图有一个成员变量CDocument* m_pDocument指向其相关的文档
框架有一个成员 CView* m_pViewActive
指向当前活动的View

几个View_Frame_Document迭代函数:(已知一个求另一个的Get函数)

CWinApp::GetFirstDocTemplatePosition
CWinApp::GetNextDocTemplate
CDocTemplate::GetFirstDocPosition
CDocTemplate::GetNextDoc
CDocument::GetFirstViewPosition
CDocument::GetNextView
CDocument::GetDocTemplate
CView::GetDocument
CView::GetParent
CView::GetParentFrame
CFrameWnd::GetActiveView
CFrameWnd::GetActiveDocument

2006年08月23日

一、什么是注册表

        注册表是2000/XP操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。
        注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息,它包括了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据
        利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施、软件配置等信息,从而方便了管理,增强了系统的稳定性。

二、注册表的功能

        刚才我们看到了,注册表中记录了用户安装在计算机上的软件和每个程序的相关信息,通过它可以控制硬件、软件、用户环境和操作系统界面的数据信息文件。
        相关知识:注册表文件的数据信息保存在system.dat和user.dat中、 利用regedit.exe程序能够存取注册表文件(其实大家可能也知道regedit32.exe,这两个程序是一样的)

三、编辑器说明:
   别说你不知道怎么进注册表啊(哈,在运行里键入regedit就可以了)
   根键:这个称为HKEY…………,某一项的句柄
   项:附加的文件夹和一个或多个值
   子项:在某一个项(父项)下面出现的项(子项)
   值项:带有一个名称和一个值的有序值,每个项都可包括任何数量的值项,值项由三个部分组成:名称、数据类型和数据。
说明:
1、名称:不包括反斜线的字符、数字、代表符和空格的任意组合。同一键中不可有相同的名称
2、数据类型:包括字符串、二进制和双字节等
3、数据:值项的具体值,它的大小可以占用64KB

第二课  总体结构分析

注册表包括以下5个根键

1.HKEY_CLASSES_ROOT
说明:该根键包括启动应用程序所需的全部信息,包括扩展名,应用程序与文档之间的关系,驱动程序名,DDE和OLE信息,类ID编号和应用程序与文档的图标等。

2.HKEY_CURRENT_USER
说明:该根键包括当前登录用户的配置信息,包括环境变量,个人程序以及桌面设置等

3.HKEY_LOCAL_MACHINE
说明:该根键包括本地计算机的系统信息,包括硬件和操作系统信息,安全数据和计算机专用的各类软件设置信息

4.HKEY_USERS
说明:该根键包括计算机的所有用户使用的配置数据,这些数据只有在用户登录系统时才能访问。这些信息告诉系统当前用户使用的图标,激活的程序组,开始菜单的内容以及颜色,字体

5.HKEY_CURRENT_CONFIG
说明:该根键包括当前硬件的配置信息,其中的信息是从HKEY_LOCAL_MACHINE中映射出来的。

第三课   HKEY_CLASSES_ROOT

    我们知道,在这一个根键中记录的是WINDOWS操作系统中所有数据文件的信息内容,主要记录了不同文件的文件扩展名和与之相对应的应用程序。这就是为什么我们双击某一个文档的时候,可以由系统自动调出应用程序的所在了。
    这个根键的子键当大家展开时发现是非常多的,它主要分为两种:一是已经注册的各类文件的扩展名;一是各种文件类型的有关信息。
      下面我们以AVIFILE举例说明一下其下面的子项的含义:

1、CLSID:分类标识,系统可以用这个类标识来识别相同类型的文件

2、Compressors:它下面有两个子项
       auds:用于设置音频数据压缩程序的类标识
       vids:用于设置视频数据压缩程序的类标识

3、defaultlcon:用于设置默认图标,这个大家可以改一下试试

4、RIFFHandlers:在它的下面有两个类标识
        AVI:用于设置AVI文件的类标识
        WAVE:用于设置WAVE文件的类标识

5、protocol:包括了执行程序和编辑程序的路径和文件名
       StdExecute(stdfileediting)_server:用于指定编辑程序
       StdExecute(stdfileediting)_PackageObjects:用于指定后打开AVI包对象的编辑程序
        StdExecute(stdfileediting)_verb:用于设置编辑程序时的工作状态,其中有0、1、2等状态

6、Shell子项:用于设置视频文件的外壳
     open:用于设置打开AVI文件的程序
     play:用于设置播放命令的程序

7、Shellex:包括了视频文件的外壳扩展

第四课  HKEY_CURRENT_USER

哈哈,这贴我要白捡分了

此根键中保存的信息(当前用户的子项信息)与HKEY_USERS_DEFAULT下面的一模一样的。任何对 HKEY_CURRENT_USER根键中的信息的修改都会导致对HKEY_USERS_DEFAULT中子项的修改。

第五课  HKEY_LOCAL_MACHINE

    此根键中存放的是用来控制系统和软件的设置,由于这些设置是针对那些使用Windows系统的用户而设置的,是一个公共配置信息,所以它与具体的用户没多大关系。

1、HARDWARE子项:该子项包括了系统使用的浮点处理器、串口等信息
       ACPI:存放高级电源管理接口数据
       DEVICEMAP:用于存放设备映射
       DESCRIPTION:存放有关系统信息
       RESOURCEMAP:用于存放资源列表

2、SAM子项:哈哈,这部分被保护了,看不到

3、SECURITY子项:该子项只是为将来的高级功能而预留的

4、SOFTWARE子项:该子项中保留的是所有已安装的32位应用程序的信息,各个程序的控制信息分别安装在相应的子项中,由于不同的计算机安装的应用程序互不相同,因此这个子项下面的子项信息也不完全一样。

5、SYSTEM子项:该子项是启动时所需的信息和修复系统时所需要的信息
      currentcontrol:保存了当前驱动程序控制集中的所有信息

第六课  HKEY_USERS

此根键中保存的是默认用户(default),当前登录用户和软件(software) 的信息,其中DEFAULT子项是其中最重要的,它的配置是针对未来将会被创建的新用户的。新用户根据默认用户的配置信息来生成自己的配置文件,该配置文件包括环境、屏幕和声音等多种信息,其中常用的3项有:

1、AppEvents子项:它包括了各种应用事件的列表
      EventLabels:按字母顺序列表
      Schemes:按事件分类列表

2、Control Panel子项:它包括内容与桌面、光标、键盘和鼠标等设置有关

3、Keyboard layout子项:用于键盘的布局(如语言的加载顺序等)
     Preload:语言的加载顺序
     Substitutes:设置可替换的键盘语言布局
     Toggle:用于选择键盘语言

第七课  HKEY_CURRENT_CONFIG

此根键存放的是当前配置的文件信息。

实际上细心的读者已经发现了,五大根键实际上并不是五个,在以前的时候我发过一个贴子,把这个做了总结,今天我再重新发上来

****************************************
我们都知道用regedit或regedit32都可以打开注册表文件,在XP系统下的时候,这两种方法其实都是一样的,当我们打开注册表后看到了类似资源管理器的东西,这里面都有什么呢?
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
    看是五个分支,其实就是HKEY_LOCAL_MACHINE、HKEY_USERS这两个才是真正的注册表键,其它都是从某个分支映射出来的,相当于快捷方式或是别名,这样的话看注册表就简单了许多了,现在说一下每个分支的作用:
HKEY_CLASSES_ROOT:
                 列出当前计算机注册的所有COM服务器和与应用程序相关联的所有文件扩展名。
HKEY_CURRENT_USER:
                 保存着当前登录到由这个注册服务的计算机上的用户配置文件。
HKEY_LOCAL_MACHINE:
                保存操作系统及硬件相关信息的配置单元,它是一个公共的配置信息与具体用户无关,其中关键是两个键值
       SOFTWARE:保存着与这台电脑中安装的应用程序相关的设置。
       SYSTEM:WINDOWS所装载的设备驱动程序以及当WINDOWS启动时所需要的各种参数。
HKEY_USERS:
                 包含当前计算机所有用户配置文件。
HKEY_CURRENT_CONFIG:
                  计算机当前会话中的所有硬件配置信息。

第八课   注册表的基本操作

1、创建项和项值
2、更值项的数据
3、删除项、子项或值项
4、查找项、值项或数据

                 具体操作请看演示

**************************说明*****************
注册表中常用的数据类型有5种:
二进制值(reg_binary):多数硬件信息以二进制数据存储,而以十六进制格式显示在注册表编辑器中
字符串值(reg_sz):包括字符串的注册表键,使用字符串数据类型
双字节值(reg_dword):是32位信息常显示成4个字节。它在出错控制功能上用处极大,其数据一般以十六进制格式显示在注册表编辑器中。
多字符串值(reg_multi_sz):允许将一系列项目作为单独的一个值使用。对于多种网络协议、多个项目、设备列表以及其他类似的列表项目来说,可以使用多字符串值
可扩充字符串值(reg_expand_sz):代表一个可扩展的字符串

第九课  注册表破坏的现象及原因

一、注册表破坏后的常见现象

1、无法启动系统
2、无法运行或正常运行合法的应用程序
3、找不到启动系统或运行应用程序所需的文件
4、没有访问应用程序的权限
5、不能正确安装或装入驱动程序
6、不能进行网络连接
7、注册表条目有错误

二、注册表被破坏的原因

1、应用程序错误:这个出现的时候比较多,因为我们知道应用程序或多或少的时候都有错误,都有可能导致不同的后果;另外在系统中安装过多的软件后,有可能出现彼此之间的冲突。

2、驱动程序不兼容:其实我发现好多出在系统自动安装的驱动程序上,如果你本身有驱动程序盘的话,还是用专业的比较好一些

3、硬件问题:这里面好我问题出现在硬件质量上,比如硬盘或内存质量不过关造成读写错误,或超频或CMOS或病毒等

4、误操作:这个大家不知出现了没有,您的误操作可能会导致注册表出现错误,有的时候甚至会很严重的。

第十课  备份注册表

不用问为什么了吧,以防万一,先备份一份,坏了一恢复,OK了

一、手工备份注册表

大家把以下几个文件直接复制到另一个文件夹就可以了
1、在windows\system32\config下有以下几个文件用以保存系统配置:

    SAM、SYSTEM、SOFTWARE、DEFAULT
2、在Documetents and settings\username文件夹中保存用户配置文件:
    NETUSER·DAT

当然对应的LOG文件应该一块保存

二、注册表导出法导出注册表

1、运行regedit.exe
2、在文件中选择导出命令
3、回答文件名和位置,OK了

三、通过系统备份功能进行备份

1、选择开始—程序—附件—系统工具—备份
2、选择高级模式点下一步
3、选择system state(系统状态),在底下文件名中位置中回答路径及文件名
4、点击开始备份

第十一课  恢复注册表

如果说恢复的前题是备份的话,那么上节课的内容一定要学好了,但也不完全都是,我们来说说怎么恢复注册表吧.

1、重新启动系统恢复注册表
      哈哈,这个简单,一重启就可以修正各种在注册表中出现的错误了,但是以硬盘上的注册表的信息正确为前提的。

2、手工恢复注册表
      什么都别说了,把上节中复制出来的文件再弄回去就OK了。

3、注册表导入法恢复

     首先上节中的导出的文件你要有啊,然后……
     A|  运行regedit.exe文件
     B|  文件中的导入
     C|  选择要导入的注册表文件
     D|  点找开就可以了

4、利用高级启动选项恢复注册表

     A|  重启计算机
     B|  启动时按F8键进入高级选项菜单
     C|  选择最后一次正确的配置。
     D|  回车了,OK

5、通过局域网来恢复注册表
     这个我们一般是指连入局域网的某一计算机(我们假设叫songxiang)的注册表被管理员锁了,但有另一台计算机(我们假设叫B)的注册表可以用,现在我们用B来解除A的锁定。
     A|  进入B的注册表
     B|  选择文件中的连接网络注册表
     C|  在查找位置中输入songxiang
     D|  这时注册表中出现了songxiang计算机的注册表
     E|  修改键值:songxiang\HEKY_USERS\S-1-5-21-823518204-688789844-842925246-500\Software\Microsoft\Windows\CurrentVersion\Policies\System下的disableregistrytools值改为0就可以了。
S-1-5-21-823518204-688789844-842925246-500这一大堆数知道什么意思吗,超级管理员。

5、重新安装系统

第十二课   注册表的优化

一、我们为什么要优化注册表

1、在计算机使用过程中可能经常添加或删除应用程序;在上网时遇到恶意网站,向注册表强行添加信息;
2、原来的应用程序卸载后注册表没删除,启动时出现没找到某某应用程序
3、多余注册表的子项可能造成浪费或降低启动速度

二、手工优化注册表

1、清除多余的DLL文件

       大家找到这个项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShareDLLs,在这个项下存放的是共享的DLL信息,注意看括号里面的数据,它表示共享文件的数目,如果为0,那么删除掉吧

2、安装卸载应用程序的垃圾信息
      这个主要是一些非法卸载应用程序导致的,我们首先要知道什么程序被非法卸载了,这个很好办,你自己现在正使着的你是知道的,其余的就没用了
注册表位置:HKEY_CURRENT_USER\Software
                        HKEY_LOCAL_MACHINE\Software
     看到没用的就全删了就行了

3、系统安装时产生的无用信息:去掉吧,有可能启动变快呢

A|  删除多余时区(我是只留北京时区)
     位置:HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Time Zones
     怎么样,很多吧,如果你只要北京时区的话,那么除了China Standard Time,其余的都删了吧

B|   清除国家列表(我只留中华人民共和国)
      位置:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Telephony\Country List
       保留86号文件夹,其余删

C|  清除多余的语言代码(我只保留英语—0409和中文—0804)
      位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrnetControlSet\Control\Nls\Locale
     没用的删了吧

D|   删除多余的键盘布局:
    位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrnetControlSet\Control\Keyboard Layouts
    你可以把每个键值都打开看看,不需要的输入法删除即可

E|  删除失效的文件关联
     位置:HKEY_CLASSES_ROOT主键可分为两部分:第一部分用来定义文件类型;第二部分与第一部分一一对应,用于记录打开文件的应用程序。
一般,在打开第二部分的可疑子项后,若该键下的COMMAND下没有内容,就可以删掉了

**********************************************
在以上我只给大家举了一些可优化的位置,其实可优化的位置也很多,比如多余的配色方案和运行中的记录啊等等,这个我就不再多讲了。
其实我们可以通过一些优化软件来进行系统的优化,比如优化大师或超级兔子等,不过不好意思,本人没有用过,所以就不再给大家讲了。
*************************************************

第十三课  个性化设置(桌面设置一)

在以后的课程中,每次我会给大家找出5个实例来进行练习,具体分析呢,希望自己多想一想,不要出现为了例子而做例子的情况,好了现在开始

1、去掉桌面快捷方式上的小键头

位置:HKEY_CLASSES_ROOT\LNKFILE
项    :IsShortcut
操作:删除此项

2、隐藏桌面上的所有图标

位置:HKEY_CURRENT_USER\Software\Windows\CurrentVersion\Policies\Explorer
新建:NoDesktop(双字节)
操作:值设为1

3、修改桌面上“回收站”的名字及图标

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}(这个大家也可直接查找“回收站”
修改:(默认)一项随便换个名字就可以了
然后展开此项,选择DEfaultIcon
这时大家看到有3个子项,意思吗一看就明白了
如果想改变图标时,只需将路径和文件名改了即可,比如改为"d:\tt.ico"

4 、去掉桌面上的网上邻居

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoNetHood(双字节)
值:   1

5、在桌面上显示系统版本号

位置:HKEY_CURRENT_USER\Control Panel\Desktop
项:PaintDesktopVersion
修改:将值改为1

***********************************************
以上例子在练习过程中需要重启计算机,当然如果想恢复只需要把改的改回来,新建的删掉也就行了

第十四课  个性化设置(桌面设置二)

6、改变窗口按钮字体的颜色

位置:HKEY_CURRENT_USER\Control Pannel\Colors
键值:ButtonText
修改:大家知道PS吧,比如改为红么(255,0,0)

7、屏蔽桌面上的IE图标

位置:HKEY_CURRENT_USER\Software\Windows\CurrentVersion\Policies\Explorer
新建值项:NoInternetIcon
修改:1

8、禁止更改桌面墙纸

位置:HKEY_CURRENT_USER\Software\Windows\CurrentVersion\Policies\Explorer
新建项值:NoChangingWallPaper(双字节)
修改:1

9、设置登录背景

位置:HKEY_USERS\DEFAULT\ControlPanel\Desktop
键值:WallPaper
修改:把背景图片一写就OK了(比如C:\aa.bmp)

***********************以上需重启计算机*********************

10、更改:我的电脑的提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}
键值:InfoTip
修改:哈,随便打吧,我打成了“这是我的电脑噢"

第十五课  个性化设置(桌面设置三)

11、更改:回收站的提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}
键值:InfoTip
修改:跟上面一样,自己改吧

12、更改IE的提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}
键值:InfoTip
修改:同上

13、更改网上邻居的提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}
键值:InfoTip
修改:同上

14、更改我的文档的提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}
键值:InfoTip
修改:同上

15、更改任务计划提示信息

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{D6277990-4C6A-11CF-8D87-00AA0060F5BF}
键值:InfoTip
修改:同上

第十六课  个性化设置(桌面设置四)

16、改变桌面图标顺序

位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}
键值:SortOrderIndex
修改:48(我的文档在第一位)
            54(我的电脑在第一位)

17、禁止帮助提示信息(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
键值:showinfotip
修改:0

18、用真彩色显示图标(需重启)

位置:HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
键值:Shell Icon BPP
修改:32

19、更改图标显示尺寸(需重启)

位置:HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
键值:Shell Icon SIZE
修改:在显示器分辨率为1024*768时可改为:48
            在显示器分辨率为1600*1200时可改为:64

第十七课  个性化设置(修改开始菜单和任务栏一)

20、自动清除“文档”菜单中的历史记录(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:CleanReccentDocsOn-Exit             (REG-DWORD)
值:1

21、禁止“文档”的历史记录(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoReccentDocsHistory             (REG-DWORD)
值:1

22、去掉开始菜单的“文档”项(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoReccentDocsMenu             (REG-DWORD)
值:1

23、去掉开始菜单的“查找”项(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoFind             (REG-DWORD)
值:1

24、去掉开始菜单的“运行”项(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoRun             (REG-DWORD)
值:1

第十八课  个性化设置(修改开始菜单和任务栏二)

25、禁止用户更改“开始”菜单(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoChangeStartMenu             (REG-DWORD)
值:1

26、禁止显示开始菜单中的windows update项(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoWindowsUpdate             (REG-DWORD)
值:1

27、屏蔽开始菜单中的“关闭计算机”项(需重启)

位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建:NoClose             (REG-DWORD)
值:1

28、加快“开始”菜单与“任务栏”的速度

位置:HKEY_CURRENT_USER\Control Panel\Desktop
键值:MenuShowDelay
值:

29、为回收站的右键菜单增加“删除”和“重命名”

位置:HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder
键值:Attributes
值:70 01 00 20

2006年08月10日

曾经有一位老师在课堂上给我们摆过一次龙门阵,他说:

“作为一个学法律的人,在遇到法律问题的时候,一定要表现出你的专业水准,不能含含混混。怎么说呢,例如。。。。”他接着举了个例子。

“例如我们在火车站站前广场上,一不小心扔了一张纸。这个时候会有一个带红袖标的老大娘走上来,要你交10元罚款。一个没学法律的人要么迅速但无奈的交钱,要么大声嚷嚷想不交。这都不是一个学法律的人的做法。那么一个学法律的人应该怎么做呢?

首先,我们要弄清楚老大娘要你交罚款是什么行为?性质是什么?我们说,这是一种行政处罚行为。行政处罚行为应该遵守《中华人民共和国行政处罚法》的规定。那就让我们严格的按照《处罚法》来走程序吧。

首先,不能因为一个人带着红袖标你就交纳罚款,带红袖标不能证明该人的身份,你要先要求老大娘出示合法的工作证件,在拿过工作证件后,你要仔细审核。审查过程建议1分钟。

然后,你应该要求老大娘告知你作出罚款决定的事实是什么。然后,你在要求她告知你,她是凭什么规定来做出处罚的,具体是哪个文件的哪一条。最后,你再要求她告知你,你现在享有什么权利(这些权利包括了行政处罚法上的申辩权,举报权,申请行政复议权等)。以上任意一环节老大娘不能告知的话,你就严肃的恫吓她:您如果不能告知我的话,那么就违反了行政处罚法的法定程序,而根据《处罚法》第55条的规定,可以对您–这个直接责任人员–进行行政处罚。罚款人反而会被罚。告知过程建议5分钟以上。

估计这时候老大娘会被你的气势震慑而放弃罚款。但如果真的有某个大娘能够流利的回答你以上的所有问题的话,那么你接下来就要乖乖的交罚款吗?不是的。根据法律规定,你这时候有陈述和申辩的权利,所谓陈述,是陈述客观事实。所谓申辩,是说出该处罚决定不当的理由。而行政机关有充分听取你的意见的义务。所以,你还等什么呢?赶快发挥你的辩才吧。

你应该陈述你是否扔纸了,你是以什么物理动作扔纸的。你为什么扔纸,你扔纸是否具有一些阻却违法的原因,譬如正当防卫,自力救济,紧急避险等。

你应该申辩你是否是未14周岁,可以不予处罚,或者未满18周岁,可以从轻或减轻处罚。申辩你在违法后已经采取了主动消除或者减轻违法行为危害后果的行为,或者受他人胁迫可以减轻处罚。申辩你违法行为轻微并及时纠正,没有造成危害后果的,应该不予处罚等等。

总之,绞尽脑汁,挖空心思的不停说话,不停的找理由,让老大娘尽到充分听取你的意见的义务。陈述申辩过程建议:越长越好,直到大娘听烦,取消罚款。

当然,你有可能遇到了一个绝世老大娘。她耐心安静的听取了你的所有意见,直到你再也说不动了为止,并仍然要求你交纳罚款。这时你可以以自己经济困难为由,要求暂缓或者分期缴纳这10元罚款。不过估计这个不会被批准,但至少为你再争取到10分钟以上的时间。

最后,你的一切权利救济手段都穷尽了,在法律上说,你以无回旋余地了,你已经充分展现了一个法律人对法律的驾御能力了,你可以交罚款了。但在交纳之后,你要认真审核老大娘出具的单据。核对处罚单位的公章,单据的格式等,以便尽到一个光荣的合法公民的义务,保障这笔罚款流入国库。如果发现有违法(例如没有公章等)的地方,你要当场翻脸,威胁予以检举,绝地反击,胜的漂亮!

当然,你也可以先和大娘商量,少交罚款,但不开票。如果大娘同意,你立刻指责她违反法律,要求举报。但此行为兵行险着,且属低级手段,作为一个有格调的法律人,建议不采用。

总之,一个法律人要充分享受并争取到法律给你权利。当然,大家不会为了10元钱耗费上大半天的时间,但你要知道怎么玩法律,要知道怎么玩的才叫酷。”

毕业之后,我接触实务的机会不多,但对实务却一直留意着。曾经有一次看过一个报道,说是昆明出现了女体盛,把女孩子的身体当作容器放置食物,然后由食客取食。这是从日本过来的一种“饮食文化”,确实比较恶心,应该取缔。后来果真也被取缔了,但依据乃是当地的卫生部门的两点理由:一两位模特作为工作人员,不能提供健康证;二在工作时未能穿戴整齐,这都违反了《卫生食品法》的规定。

有人认为卫生部门做出的这个处罚依据是搞笑的。女体盛明明是违法道德的行为,侮辱女性,公然挑战社会道德底线,用什么理由不行,偏偏搞这个出来,这不是政府执法无力的明显表现吗?

但我却为这个处罚的出台拍手叫好。因为某个经营行为违反道德而予以取缔,是法律的泛道德倾向。而法律的泛道德化恰恰是现代法律的大忌。因为法律一旦去强制执行某种道德标准的时候,往往就是法律专制的前兆。但是社会的道德又需要法律去支撑,而且执法者也应该有意识的去维护道德底线。这个矛盾怎么解决,往往看出执法者的素质高下。

根据《卫生食品法》的规定取缔女体盛,在法律有明确规定的框架里维护了道德标准,依据的理由看似与道德无关,但却巧妙的在效果上起到了作用,真正是高手所为,技惊四座!颇有美国宪法史上的马伯里诉麦迪逊一案的风采。

所以要玩,咱就玩法律