profect->Setting->General中的“Use MFC in a Shared DLL”和“Use MFC in a Static Library”的区别?我编的一个ActiveX中调用含对话框的DLL,两种情况下都可以编译,但只能在“Use MFC in a Static Library”时运行。不知道为什么

解决方案 »

  1.   

    Use MFC in a Shared DLL:共享库,运行需mfc.dll等
      

  2.   

    Use MFC in a Shared DLL 程序运行是需要MFC类库的支持;
    而Use MFC in a Static Library 可以在没有MFC类库的支持下运行,可以在任何WINDOWS系统下运行。
      

  3.   

    Use MFC in a Static Library 把MFC的库连接到你的程序里,所以这样编译得到的程序很大(相对Use MFC in a Shared DLL 而言)Use MFC in a Shared DLL 则在运行的时候还需要MFC动态库的支持,没有这些库,程序无法运行,由于不包含MFC的库,程序就小的多。
      

  4.   


    以下摘自AFX.H文件。
    #ifndef _AFXDLL  //MFC 静态库
    #ifndef _UNICODE
    #ifdef _DEBUG
    #pragma comment(lib, "nafxcwd.lib")
    #else
    #pragma comment(lib, "nafxcw.lib")
    #endif
    #else
    #ifdef _DEBUG
    #pragma comment(lib, "uafxcwd.lib")
    #else
    #pragma comment(lib, "uafxcw.lib")
    #endif
    #endif
    #else            //MFC 动态库
    #ifndef _UNICODE
    #ifdef _DEBUG
    #pragma comment(lib, "mfc42d.lib")
    #pragma comment(lib, "mfcs42d.lib")
    #else
    #pragma comment(lib, "mfc42.lib")
    #pragma comment(lib, "mfcs42.lib")
    #endif
    #else
    #ifdef _DEBUG
    #pragma comment(lib, "mfc42ud.lib")
    #pragma comment(lib, "mfcs42ud.lib")
    #else
    #pragma comment(lib, "mfc42u.lib")
    #pragma comment(lib, "mfcs42u.lib")
    #endif
    #endif
    #endif//下面你可以发现msvcrt.lib和LIBC.lib没有UNICODE的区别
    #ifdef _DLL       //多线程动态库
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "msvcrtd.lib")
    #else
    #pragma comment(lib, "msvcrt.lib")
    #endif
    #else
    #ifdef _MT        //多线程静态库
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "libcmtd.lib")
    #else
    #pragma comment(lib, "libcmt.lib")
    #endif
    #else            //单线程静态库
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "libcd.lib")
    #else
    #pragma comment(lib, "libc.lib")
    #endif
    #endif
    #endif//导入WINDOWS核心库和扩展库,在使用MFC时这些库是默认的库,如果选择忽略默认库则会发生LINK2001错误
    //但是有些默认库可能没有用到,你可以显式的忽略它(在LINK选项里设置)
    #pragma comment(lib, "kernel32.lib")
    #pragma comment(lib, "user32.lib")
    #pragma comment(lib, "gdi32.lib")
    #pragma comment(lib, "comdlg32.lib")
    #pragma comment(lib, "winspool.lib")
    #pragma comment(lib, "advapi32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "comctl32.lib")//下面是指定生成某些专用的OBJ文件完成连接
    // force inclusion of NOLIB.OBJ for /disallowlib directives
    #pragma comment(linker, "/include:__afxForceEXCLUDE")// force inclusion of DLLMODUL.OBJ for _USRDLL
    #ifdef _USRDLL
    #pragma comment(linker, "/include:__afxForceUSRDLL")
    #endif// force inclusion of STDAFX.OBJ for precompiled types
    #ifdef _AFXDLL
    #pragma comment(linker, "/include:__afxForceSTDAFX")
    #endif#endif //!_AFX_NOFORCE_LIBS『
    进入点函数的选择是由C运行库进行的。
    在TCHAR.h中将_tWinMain 定义为 WinMain函数,却没有UNICODE版本的进入点函数。所以在MFC的UNICODE中要自己定义进入点函数wWinMainCRTStartup
    而在没有MFC的WIN32程序中使用UNICODE则一点问题都没有而且UNICODE和_UNICODE分开定义
    』可以在LINK ProjectOption中设定如下:/verbose:lib 来查看导入了哪些库。