精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>C、C++语言基础>>一些关于任务的错误认识

主题:一些关于任务的错误认识
发信人: riffle()
整理人: skyice(1999-12-16 01:01:46), 站内信件
    任务有时比较难以理解,所以程序员有一些关于
任务的错误认识也不足为奇。这里讲述并澄清两个经
常遇到的问题。

    一个最普遍的错误认识是“每个任务有一个窗口”。
尽管屏幕上的窗口是任务存在的最显而易见的证明,
但任务和窗口实际上毫不相干,不要把它们混为一谈。
任务只表示运行过程,除此之外,别无他义。任务是
否显示窗口完全取决于你。当然可以很容易地建立一
个任务而不建立任何窗口,使它完成有用的工作。当
你分析Windows 95中的“任务链表”时,这一点很重
要,一定要记住。那个链表显示顶层窗口,与KRNL386
维护的真正的任务链表完全不是一回事。

    程序员们另一个普遍的错误认识是“DLL有类似于
任务的特性”。这些程序员说了这样一些话,“我想
让我的DLL建立一个能被它的不同程序都可以使用的窗
口”,再如,“我的DLL将打开一个文件句柄,使用DLL
的不同程序都可以使用该句柄”。这些话说明程序员
有这样的错误认识,就是DLL拥有文件句柄和窗口。DLL
只不过是一些被任务使用的附加代码。DLL的代码所在
文件与EXE的完全不同。因此它与系统资源的拥有权根
本扯不上关系。

    建立窗口或打开文件句柄的DLL只是代表调用它的
任务来做这些事。而这个DLL自己无权拥有这些东西。
因此,当你在一个DLL中调用CreateWindows建立一个
窗口时,是当前正在运行的任务拥有这个的窗口,而
不是DLL。如果该任务结束了,即使DLL还保持在内存
中,那个窗口也不存在了。同样地,如果一个DLL打开
一个文件句柄,这个句柄属于当前任务。如果另一个
任务现在也在调用DLL,并且试图使用为第一个任务打
开的文件句柄,就会产生一个错误——或更糟糕的情
况——使用了错误的文件句柄。为什么么呢?因为文
件句柄只对于第一个正在运行的任务(打开文件的任
务)是合法的。

  以上摘自《Windows 95 系统编程奥秘》,P409。

    事实上在内存中,DLL的代码只有一份,而数据
却可能有多份,分别对应不同的任务。可以说DLL的
代码地址空间和各个不同的EXE文件所拥有的代码地
址空间是不一样的,各个使用该DLL的EXE文件各自拥
有其代码地址空间和数据地址空间。

    精华区中关于DLL地址空间的论述似乎有些不妥。
因此,贴出以上文字,请斑竹和高手们指正。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.37.161]

[关闭][返回]