VC6.0工程向导中可以建立三种库工程,分别是是静态库,动态库,和MFC动态库,他们之间的特点和区别如下。
一.Win32 Static Library
a.函数无需导出,只需声明时前面加extern "C" 即可。DLL工程和项目工程可以在不需做任何修改设计的情况下使用同一头文件。
b.项目工程在编译完成后可以删除lib文件。
c.DLL工程编译后只生产LIB文件,不会生产DLL文件
二.Win32 Dynamic-Link Library
a.向导中可以选择建立空工程或带有DLLMain入口函数的工程。Windows在加载DLL的时候,需要一个入口函数DLLMAIN。如果不显式提供DLLMAIN,系统会从其它运行库中引入一个不做任何操作的缺省DllMain函数版本。
b.函数需要导入导出,_declspec(dllimport) _declspec(dllexport),导致不能直接共用同一头文件,如需使用需要做些处理。
c.DLL工程编译后生成一个LIB文件和一个DLL文件。
d.DLL有显式加载和隐式加载两种加载方式,隐式加载编译时需要连接LIB文件,编译完成后可删除。显式加载不需要LIB文件。typedef int(*lpAddFun)(int,int);LoadLibrary();FreeLibrary;GetProAddress.
三.MFC动态连接库
1.常规库
可以内部使用MFC,但不能导出MFC相关的东西
A.静态链接MFC:
生成的DLL文件较大,但可以脱离MFC环境运行,默认使用DLL中的资源
B.共享链接MFC:
生成的DLL文件较小,但可以脱离MFC环境运行,默认使用EXE中的资源
2.扩展库
a.可以内部使用MFC,可以导出MFC相关的东西
b.只能动态链接,默认使用EXE中的资源。
若要使用DLL中的资源,有两种方法:
1)用AfxSetResourceHandle设置要使用的资源句柄。可使用AfxGetResourceHandle得到当前句柄,以便使用完后恢复之前的状态;DLL资源句柄即DllMain传进来的参数获取hInstance(扩展库)或theApp的成员变量m_hInstance(常规库)
2)在要使用DLL中的资源之前调用AFX_MANAGE_STATE(AfxGetStaticModuleState( )),该宏会将资源切换到DLL中,并在本模块结束后自动恢复之前的状态。