Dll知识小总结

DLL 根据是否为MFC类型的 DLL可以分为两类:MFC dll 与非MFC dll


非 MFC DLL(即:Win32 DLL) 是内部不使用 MFC 的 DLL,这类 DLL 中的导出函数可由 MFC 或非 MFC 可执行文件调用。
函数通常是通过标准 C 接口从非 MFC DLL 导出的。


MFC dll种类:

1:生成静态链接 MFC 的规则 DLL

2:生成动态链接 MFC 的规则 DLL

3:生成始终动态链接 MFC 的 MFC 扩展 DLL(例如:如果要重新写CEDIT类,则需要此种类型的Dll)


 如果 DLL 不使用 MFC,则使用 Visual C++ 生成非 MFC Win32 DLL。将 DLL(静态或动态)链接到 MFC
 会占用大量磁盘空间和内存。除非 DLL 确实使用 MFC,否则不要链接到 MFC。

 如果 DLL 要使用 MFC,且将由 MFC 或非 MFC 应用程序使用,则必须生成动态链接到 MFC 的规则 DLL
 或静态链接到 MFC 的规则 DLL。大部分情况下可能需要使用动态链接到 MFC 的规则 DLL,因为这种 DLL
 的文件大小要小得多,且使用共享 MFC 版本会节省大量内存。如果静态链接到 MFC,则由于 DLL 会加载
 自己的私有 MFC 库代码副本,DLL 的文件大小会较大,且有可能占用额外的内存。

 生成动态链接到 MFC 的 DLL 要比生成静态链接到 MFC 的 DLL 快,因为前者不需链接 MFC 本身。在链接
 器必须压缩调试信息的调试版本中尤其如此。通过与已经包含调试信息的 DLL 链接,DLL 中将只有很少的
 调试信息需要压缩。

 动态链接到 MFC 的一个缺点是必须用 DLL 发布共享 DLL:Mfcx0.dll 和 Msvcrxx.dll(或类似的文件)。
 MFC DLL 可随便重新发布,但仍必须在安装程序中安装 DLL。另外必须交付 Msvcrxx.dll,它包含程序和
 MFC DLL 本身都要使用的 C 运行时库。

 如果 DLL 仅由 MFC 可执行文件使用,则可以选择生成规则 DLL 或扩展 DLL。如果 DLL 实现从现有 MFC
 类派生的可重用类,或如果需要在应用程序和 DLL 之间传递 MFC 派生的对象,则必须生成扩展 DLL。

 如果 DLL 动态链接到 MFC,则可能要用 DLL 重新发布 MFC DLL。当在多个可执行文件之间共享类库以节
 省磁盘空间和最小化内存使用时,此结构尤其有用。

    int   WINAPI   MyFunction(long   myID); 
 __declspec(dllimport)
 __declspec(dllexport)
 export,就是DLL要导出函数给应用程序用   (在dll中使用的关键字)  
 import,是应用程序要引用DLL中定义的函数、变量(是在应用程序客户端使用的关键字)
 应用中一般采用条件变异的方式来应用
 例如:
#ifdef XXDLL_EXPORTS
#define XX_API __declspec(dllexport)
#else
#define XX_API __declspec(dllimport)
#endif
这样如果在dll的预编译中定义了XXDLL_EXPORTS,应用程序预编译中没有定义XXDLL_EXPORTS,
则在使用XX_API时在dll中使用XX_API就是__declspec(dllexport)应用程序中能够使用就是__declspec(dllimport)
  2.WINAPI的意思是stdcall调用约定,没有它就是缺省的cdecl调用约定。(MFC默认的调用方式:_cdecl)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall

  DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC必须成对出现,作用是"可以在运行时确定类对象的类型",
  IMPLEMENT_DYNAMIC的作用是实现这种“确定对象类型”的目的。前者是声明动态识别,后者是动态实现,
  分别出现在.h文件和.cpp文件中。
  DECLARE_DYNAMIC  
  声明了一个静态变量、一个虚函数GetRuntimeClass()     
  IMPLEMENT_DYNAMIC  
  给变量赋初值、定义GetRuntimeClass()
 
  DECLARE_DYNAMIC支持运行时类型识别,
  DECLARE_DYNCREATE支持动态创建,
  DECLARE_SERIAL支持串行化

你可能感兴趣的:(Dll知识小总结)