精华内容
下载资源
问答
  • 昨天写了一个小程序,使用的是MFC应用程序的工程,工具的版本为VS2013,工程参数都是默认的,其中有一项设置叫做“MFC的使用”,默认设置是“在共享DLL中使用MFC”,我虽然看到了但是没有放在心上,编码期间解决了一...

    前言

    我们在使用Microsoft Visual Studio软件(也就是我们常常说的VS)时,其中项目属性中有一项叫做“MFC的使用”,里面包含有不同的设置,会影响我们所编写的程序的使用,今天我就遇到了这个情况,我们一起来总结一下,避免犯下相同的错误。

    内容

    昨天写了一个小程序,使用的是MFC应用程序的工程,工具的版本为VS2013,工程参数都是默认的,其中有一项设置叫做“MFC的使用”,默认设置是“在共享DLL中使用MFC”,我虽然看到了但是没有放在心上,编码期间解决了一个MFC使用多字节字符集报错的问题,此处不展开,后续再表,就这样程序编写完成,非常完美!交给了一个叫做“小闪电”的用户,然后她怀着万分激动地心情拿到公司电脑一使用,结果报错了!!!

    这里写图片描述

    “无法启动此程序,因为计算机中丢失mfc120.dll。尝试重新安装改程序以解决此问题。”,看到这个问题我首先想到的就是动态链接库的事情,因为我使用的是VS2013正好使用的是12.0版本的库文件,所以说应该是目标机上没有这个库,当然可以手动下载这个库文件,添加至“C:\Windows\System32”目录,但是在程序开发工程中,你无法要求所有的用户都会这样做,只能从自身找解决方法了。

    当然我也仔细查了一下这个叫做“MFC的使用”的参数,它其实包括3个选项,具体如截图:

    这里写图片描述

    1. 使用标准Windows库   
    2. 在共享DLL中使用MFC    
    3. 在静态库中使用MFC

    这三种当然有着不同的意义:

    • 第一种顾名思义,是使用WINDOWS SDK API库,不使用MFC类。话说一个MFC应用程序不使用MFC类是个什么情况,一开始我也想不通,后来我新建了一个MFC应用程序的工程,然后把这这项参数填成这一种,然后程序编译失败,具体错误如下图,这就说明问题了,如果是MFC工程必须选择第二项或者第三项,而第一项“使用标准Windows库”是为非MFC工程准备的(不知理解是否正确,请大神指教)。

    这里写图片描述

    • 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。这就是我的程序一开始选择的选项,要求目标计算机中至少要包含“mfc120.dll”库文件,否则无法使用。

    • 第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行。个人感觉程序测试期间使用这个选项应该比较好,起码可以保证程序的正常运行。

    总结

    • MFC应用程序的工程,关于“MFC的使用”属性,应该选择“在共享DLL中使用MFC”或者“在静态库中使用MFC”。
    • “使用标准Windows库” 选项只能用在非MFC工程中,如果用在MFC工程会导致代码编译报错。
    • “在共享DLL中使用MFC” 选项生成的程序可执行文件比较小,但是要求目标机器必须装有必要的库文件。
    • “在静态库中使用MFC” 选项生成的程序可执行文件几乎所有的Windows都可以执行,但是程序较大一些,其中包含必要的库文件,可以基本保证在别的机器上正常运行。
    展开全文
  • 共享DLL中使用MFC 链接成EXE的时候,没有将MFC的一些DLL包含进来,所以EXE文件较小,但是运行时候要求系统中要有相关的DLL文件。发给别人机器的时候,可能会出现找不到***库或者无法启动程序等类似错误。 打包发布...

    在这里插入图片描述

    1. 在共享DLL中使用MFC
      链接成EXE的时候,没有将MFC的一些DLL包含进来,所以EXE文件较小,但是运行时候要求系统中要有相关的DLL文件。发给别人机器的时候,可能会出现找不到***库或者无法启动程序等类似错误。
      打包发布软件时候需要将用到的dll都打包进来。至于查看使用到哪些DLL了,可以用Spy来侦测。
    2. 在静态库中使用MFC
      链接成EXE的时候,将所用到的MFC中的函数相关代码已经包含进EXE文件,文件较大,但是可以在没有相关DLL的机器上运行。可以直接编译链接完发布就行。
    展开全文
  • 共享DLL 和静态库DLL

    千次阅读 2015-12-12 13:20:33
    一 编写DLL 第一种含有 DLLMAIN的 WIN32 DLL #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOI


    一 编写DLL

    第一种含有 DLLMAIN的 WIN32 DLL






    #include "stdafx.h"
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    
    



    在要导出的类前面

    AFX_EXT_CLASS


    class AFX_EXT_CLASS GudianVClass{










    另一种是MFC DLL 不含DLLMain


    #include "stdafx.h"
    #include "MFCLibrary3.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    //
    //TODO:  如果此 DLL 相对于 MFC DLL 是动态链接的,
    //		则从此 DLL 导出的任何调入
    //		MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
    //		该函数的最前面。
    //
    //		例如: 
    //
    //		extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //		{
    //			AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //			// 此处为普通函数体
    //		}
    //
    //		此宏先于任何 MFC 调用
    //		出现在每个函数中十分重要。  这意味着
    //		它必须作为函数中的第一个语句
    //		出现,甚至先于所有对象变量声明,
    //		这是因为它们的构造函数可能生成 MFC
    //		DLL 调用。
    //
    //		有关其他详细信息,
    //		请参阅 MFC 技术说明 33 和 58。
    //
    
    // CMFCLibrary3App
    
    BEGIN_MESSAGE_MAP(CMFCLibrary3App, CWinApp)
    END_MESSAGE_MAP()
    
    
    // CMFCLibrary3App 构造
    
    CMFCLibrary3App::CMFCLibrary3App()
    {
    	// TODO:  在此处添加构造代码,
    	// 将所有重要的初始化放置在 InitInstance 中
    }
    
    
    // 唯一的一个 CMFCLibrary3App 对象
    
    CMFCLibrary3App theApp;
    
    
    // CMFCLibrary3App 初始化
    
    BOOL CMFCLibrary3App::InitInstance()
    {
    	CWinApp::InitInstance();
    
    	return TRUE;
    }


    在要导出的类前面

    #define DllExport   __declspec( dllexport )

    class DllExport  Factory
    {
    public:
    
    	static GudianVClass *GetGudianV();
    
    	static void Destory();
    
    private:
    	static CGudianView* pView;
    };
    

    如果还不行的话,其它要导出的子类前添加

    AFX_EXT_CLASS


    class AFX_EXT_CLASS GudianVClass{


    二 工程中使用DLL


    1  工程编译只需LIB

        因为编译EXE时,只需LIB将DLL函数地址写入即可


    2 EXE运行时,只需DLL

       因为LIB信息已经编译到EXE中了


    3 debug/release 下编译时,使用不同版本的LIB和DLL

    为方便 ,可以通过#ifdef _DEBUG  自动判断是debug版本还是release版本






    #ifdef _DEBUG
    #define new DEBUG_NEW
    
    //第二步之二 加载LIB debug 和 release 不同模式的LIB
    #pragma comment( lib, "gudianDllHead\\gudian_debug.lib" )  //添加LIB库
    #else
    #pragma comment( lib, "gudianDllHead\\gudian_release.lib" )
    
    #endif


    4  DLL放入子目录   通过延迟加载  隐形实现




    在调用DLL前 ,通过SetDllDirectory设置DLL路径


    Dlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	TCHAR szPath[255];
    	GetModuleFileName(NULL, szPath, 255);
    	*(_tcsrchr(szPath, _T('\\')) + 1) = 0;
    	exeDirPath = szPath;  // 含有\符
    
    	CString dllPath=exeDirPath+L"mantangcai\\";
    	
    	SetDllDirectory(dllPath);


    古典界面库网址

    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/201707/20/1500563524_793674.jpg)
  • 共享Dll和静态库中使用MFC的区别

    千次阅读 2017-05-05 15:18:23
    2.在共享DLL中使用MFC 3.在静态库中使用MFC  第一种顾名思义。  第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。第三种是将DLL中的...

    使用VS编译MFC工程是在项目属性中有一项MFC的使用,有三种设置:    

    1.使用标准Windows库   
    2.在共享DLL中使用MFC    
    3.在静态库中使用MFC    
           第一种顾名思义。
           第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。 第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行。    
           同时,如果程序本来是第二种方式,发给同事,在同事机器上运行时,可能会出现错误:   “无法启动程序……,由于应用程序配置不正确,未能启动此应用程序。”我觉得,在开发阶段的程序都选第3种比较好吧,不用管大小以及效率,等后期打包的时候用spy等其他工具都可以,来侦测DLL等就行了。
    展开全文
  • c++MFC工程修改在共享DLL中使用MFC为使用标准Windows库的解决办法 由于创建MFC工程时,默认是在共享DLL中使用MFC,如果将此选项改成使用标准Windows库,会报如下错误 c:\program files\microsoft ...
  •  “在共享DLL中使用MFC”指的是在打包时一些MFC的DLL的内容没有被硬编译到exe文件中,所以exe文件会较小,但是在运行时要求运行的系统环境中要有相关的DLL文件。  “在静态库中使用MFC”是将DLL对应的lib静态库中...
  • 共享 DLL 中使用 MFC 出现内存泄漏

    千次阅读 2015-04-28 10:06:04
    写了个lib库程序。 在控制台应用程序中调用该lib库,执行都正常,退出时也没有内存泄漏。 在MFC界面应用程序中调用该lib库,执行...[在共享 DLL 中使用 MFC] 提示内存泄漏 设置为[在静态库中使用 MFC]后,提示消失。
  • 共享DLL中使用MFC与在静态库中使用MFC的区别  "在共享DLL中使用MFC"指的是打包时一些MFC的DLL的内容没有被硬编码到在EXE文件中,所以EXE会文件较小,但是运行时要求运行的系统环境中要有相关的...
  • 找了一个MFC工程,首次编译,黑窗口一闪而过,在项目属性,项目默认值-》MFC的使用-》在共享DLL中使用MFC,F5后,报错:找不到指定文件,以及无法解析的外部符号错误49个,请教同事,同学,无果。 重新安装VS2013 后...
  • MFC的使用中修改选项
  • 共享DLL中使用MFC 多线程DLL(/MD) 在静态库中使用MFC 多线程调试(/MTD) 区别:(1)、在共享库中使用MFC,没有把系统VC的CRT运行库,编译到可执行文件中,可执行文件相对较小,但...
  • 1.在静态库中使用 MFC 会将MFC库一起编译,发布...2.在共享 DLL 中使用 MFC 的区别 系统如果有MFC相关DLL,则运行程序木有问题,但如果没有,则需要将相关DLL打包,否则程序运行报DLL错误. 注:DLL相当于源代码的集合文件.
  •  “在共享DLL中使用MFC”指的是在打包时一些MFC的DLL的内容没有被硬编译到exe文件中,所以exe文件会较小,但是在运行时要求运行的系统环境中要有相关的DLL文件。  “在静态库中使用MFC”是将DLL对应的lib静态库中...
  • 2.在共享DLL中使用MFC 3.在静态库中使用MFC  第一种顾名思义。  第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。  第三种是将DLL
  • 共享DLL中使用MFC 和在静态库中使用MFC区别

    万次阅读 多人点赞 2011-04-11 10:45:00
    共享DLL中使用MFC 3.在静态库中使用MFC 第一种顾名思义。第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。第三种是将DLL中的相关代码写进...
  • 共享DLL中使用MFC 3.在静态库中使用MFC 第一种顾名思义。第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。第三种是将DLL中的相关代码写...
  • 我们都知道同一个应用程序的多个...on-write机制,当有一个实例去修改共享的那个数据区的时候,那么操作系统会另外分配一个内存块,该内存块就是存放这个实例修改的数据,所以并不会影响其他的应用程序实例。 那么可
  • 2.到vs2015安装目录下负责依赖的dll,因为新版vc启用了新的c/c++运行时,xp版本没有发布对应的补丁,所以需要自己复制进去安装目录。 这里要兼容32位故只需要x86的dll, 我的机器具体如下: 转到 F:\Program Files (x86...
  • 共享数据DLL允许进程以类似于Windows 3.1 DLL共享数据的方式访问读写数据,多个进程都可以对该共享数据DLL进行数据操作,达到共享数据的目的。在WIN32中为建立共享内存,必须执行以下步骤: 首先创建一个有名的...
  • 言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己...(1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点
  • 共享DLL中使用MFC  3.在静态库中使用MFC  第一种顾名思义。第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。第三种是将DLL中的相关...
  • 没有忽略任何LIB了,只是 在Preprocessor中定义_AFXDLL, PROJECT->SETING->C/C++->PREPROCESSOR->定义 _...注解:以上解决方法貌似可以解决了问题,实则不然,因为加上了编译选项之后实际上是改成了共享的MFC
  • 通过图文描述介绍MFC与dll之间通过共享内存建立通信,文件内附有可直接复制的代码,文档和文档里的代码是基于VS2017编写的。前两天通过VS2019实现,文件里的代码在通过VS2019仍然可以实现。初学MFC与dll之间通信的...
  • DLL中导出函数的声明有两种方式:一种是在函数声明中加上_declspec(dllexport)关键字,另一种方式就是采用模块定义文件声明。.def 文件为连接器提供了有关被链结程序的导出、属性及其他方面的信息。在连接阶段,可以...
  • 加载英文资源DLL时应该在主工程里面讲MFC的使用设置为:在共享DLL中使用MFC。不然会出现系统的资源加载不进来的原因。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,805
精华内容 39,922
关键字:

共享dll