WEB开发网
开发学院软件开发VC 持续化更新的视状态,在DLL中使用托管扩展 阅读

持续化更新的视状态,在DLL中使用托管扩展

 2006-07-20 11:43:22 来源:WEB开发网   
核心提示: 由于 MFC 到处都有需要初始化的不可或缺的静态对象,那是不是就意味着不能在混合模式的 DLL中使用 MFC 了呢?当然不是!微软的老大提供了一种方案,持续化更新的视状态,在DLL中使用托管扩展(8),参见前面提到的“Converting Managed Extensions&

由于 MFC 到处都有需要初始化的不可或缺的静态对象。那是不是就意味着不能在混合模式的 DLL中使用 MFC 了呢?当然不是!微软的老大提供了一种方案。参见前面提到的“Converting Managed Extensions”一文,稍微不同的是根据你是否使用 LoadLibrary 或输入库以及你是编写常规 DLL 还是 COM 对象。

既然你问的是关于 MFC 的问题,我就描述一下使用引入库的 C++/MFC DLLs 该怎么做,这是一种更常见的情况。基本思路很简单:首先在链接选项中添加 /NOENTRY,将你的 DLL 建立成一个 NOENTRY DLL。这样使得链接器不至于报出警告。为了初始化对象,你必须编写自己的 初始化/终止处理函数(initialization/termination)并输出它们。任何使用你的 DLL 的应用程序在调用DLL中的函数之前都必须先调用你的初始化函数,同样,在结束时必须调用终止函数。

感觉这是个很好的计划,但是如何实现初始化/终止函数呢?幸运的是微软的老大提供了一个文件,其中包含了这两个函数的实现,从而使事情变得简单化;你只要包含该文件并调用这两个函数即可:

#include <_vcclrit.h>
BOOL __declspec(dllexport) MyDllInit() {
  return __crt_dll_initialize();
}
BOOL__declspec(dllexport) MyDllTerm() {
  return __crt_dll_terminate();
}

其实并不难,是吗?如果你打开 _vcclrit.h 文件,看看过去那些粗糙的多线程处理代码,你会发现 __crt_dll_initialize 所做的工作无外乎调用 _DllMainCRTStartup(DLL_ PROCESS_ ATTACH)。同样,__crt_dll_terminate 则调用 _DllMainCRTStartup (DLL_PROCESS_DETACH)。如果你用 C++ 编写代码,你不会留意丢失的 Boolean 返回码,你可以写一个自动初始化类,用其构造函数/析构函数封装 __crt_dll_xxx 调用,因此,应用程序只要在全局范围的某个地方创建一个自动初始化类对象的实例即可:

上一页  3 4 5 6 7 8 9  下一页

Tags:持续化 更新 状态

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接