2009-10-16 22:10:14 xxxxxx999999 阅读数 263
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10082 人正在学习 去看看 夏曹俊
dll 编译器 dll 反编译器dll 编译器 dll 反编译器
2019-08-01 21:17:24 duiwangxiaomi 阅读数 210
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10082 人正在学习 去看看 夏曹俊

问题描述
    运行程序时出现如下错误:
图1
还有丢失msvcr120d.dll、msvcr120.dll、msvcp120.dll等问题,不一一列出图片了。
说明
    msvcp120d.dll是微软vc组件的一个重要dll文件,缺少或损坏它可能会造成部分软件或游戏无法正常运行。
解决方案
    下载对应的dll,放到指定路径下,分为System32和SysWOW64两个文件夹,【注意】两个文件夹中dll可能不一样,要对用覆盖,将两个文件夹中的dll都下载并覆盖。
覆盖文件夹路径为:
1.C:\Windows\System32
2.C:\Windows\SysWOW64
提供一个下载链接,里面包含文中所说的全部dll文件,并有文件放置说明。
dll文件下载链接
有不懂问题可以在下面留言~

2011-11-07 19:02:23 wche1990 阅读数 4079
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10082 人正在学习 去看看 夏曹俊
学习了三种动态链接库的基本知识,分别是Win32DLL,MFC常规DLL和MFC拓展DLL。

    Win32DLL使用的是Win32的API实现的,只能导出函数,能被各种应用程序调用,适用范围最广。

    MFC常规DLL是适用MFC创建的,就像MFC程序跟Win32程序的关系一样,MFC常规DLL和Win32DLL的关系也是如此。它使用MFC的机制,只能导出标准C函数。如此,它便可以被大部分Win32程序调用。

    MFC拓展DLL也也使用的是MFC机制创建的,相比于MFC常规DLL,拓展DLL可以导出C++类和MFC派生类,如此扩大了DLL的接口范围。此长彼消,MFC拓展DLL的适用范围较小,只能被MFC程序调用。因为它导出的不只是函数,还有C++类和MFC派生类。

    另外,所有的动态链接库都有两种链接方式:隐式调用和显示调用。隐式链接使用起来比较方便,不过不够灵活;显示链接可以在真正要用DLL的时候才装入,并在适当的时候释放,操作相对复杂一些。


2017-01-16 14:40:30 tony2278 阅读数 5440
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10082 人正在学习 去看看 夏曹俊
MFC Dll封装了MFC的库类。是MFC运行时的必需吧。
win32是SDK。你说他们的区别嘛,其实就是MFC和SDK的区别


一般做MFC程序时,选用MFC DLL
MFC规则DLL,没有显性DLLMAIN


MFC DLL本身也分为两种,一种是常规DLL,一种是扩展DLL。
MFC常规DLL在DLL内部可以用MFC类的, 但是给外部的接口并不提供MFC类的支持,还是提供Win32 DLL同样的接口,与Win32的差别在于,它的内部可以用MFC类
扩展DLL可以有C++的接口,它可以导出C++类给客户端。
导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。
同时,在DLL中也可以使用MFC。


MFC DLL 和win32 DLL的差别就是一个使用MFC类库,一个不使用
如果你代码中用到的MFC,那么一定要创建MFC DLL,因为win32 DLL用不了MFC类


MFC扩展DLL是通常实现从现有Microsoft基础类库类派生的可重用类的DLL。
    MFC扩展DLL具有下列功能和要求:
    1 客户端可执行文件必须是用定义的_AFXDLL编译的MFC应用程序。
    2 扩展DLL也可由动态链接到MFC的规则DLL使用。
    3 扩展DLL应该用定义的_AFXEXT编译。这将强制同时定义_AFXDLL,并确保从MFC头文件中拉入正确的声明。它也确保了在生成DLL时将AFX_EXT_CLASS定义为__declspec(dllexport),这在使用此宏声明扩展DLL中的类时是必要的。
    4 扩展DLL不应实例化从CWinApp派生的类,而应依赖客户端应用程序(或DLL)提供此对象。
    5 但扩展DLL应提供DllMain函数,并在那里执行任何必需的初始化。
    扩展DLL是使用MFC动态链接库版本(也称作共享MFC版本)生成的。只有用共享MFC版本生成的MFC可执行文件
    (应用程序或规则DLL)才能使用扩展DLL。客户端应用程序和扩展DLL必须使用相同版本的MFCx0.dll。使用扩展DLL,可以从MFC派生新的自定义类,然后将此“扩展”版本的MFC提供给调用DLL的应用程序。



主要是资源的管理吧
mfc扩展dll会把当前dll的句柄加入一个全局资源句柄列表。而普通的dll则不会。即使支持mfc也不会。这样你每次用mfc类创建资源的时候要多写几行代码 。但你用在mfc扩展dll用win32来访问资源也需要多写代码。


MFC和SDK的区别

MFC DLL 使用了MFC  体积比较大,(好像只供MFC程序调用)

WIN32 DLL 是纯C++ API 写的,体积也比较小,可以供更多程序调用


Dll创建及使用详解

/* 

扩展DLL 可以导出类

扩展DLL服务器方的类定义:

 

  class AFX_CLASS_EXPORT 到出类名: public 基类名  

  { 

    ............ 

   } 

 

   

扩展DLL客户方的类声明头文件:

    #pragma  comment(lib,"lib

文件名

") 

 

 class AFX_CLASS_IMPORT 到出类名: public 基类名

  { 

    ............ 

  } 

*/ 

 

/* 

正规DLL 可以导出标准C语言函数

正规DLL服务器方的函数定义:

  //

头文件中函数声明

  extern "C" __declspec(dllexport)  

返回值   函数名

(

形式参数声明

 

 //源文件中函数实现

      extern "C" __declspec(dllexport)  

返回值 函数名

(

形式参数声明

)  

     

AFX_MANAGE_STATE ( AfxGetStaticModuleState() );//

第一条语句

            .............. 


} 

  //

在def模块文件中声明函数序号

    EXPORTS   导出函数名  @序号数字  

正规DLL客户方的隐式函数声明头文件:






2010-01-06 14:56:00 delphiwcdj 阅读数 4371
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10082 人正在学习 去看看 夏曹俊

2  MFC DLL ——扩展的和正规的

MFC AppWizard 可以让我们创建 MFC 库支持的两种 DLL :扩展的 DLL 和正规的 DLL 。这两种类型的区别是什么呢?

说明: 当然, Developer Studio 也让我们创建纯的、与 MFC 库无关的 Win32 DLL ,就像它让我们创建与 MFC 库无关的 Windows 程序一样。

²      扩展 DLL 支持 C++ 接口,换句话说,该 DLL 可以导出整个类,客户可以构造这些类的对象或从这些类进行派生。扩展 DLL 动态连接到 MFC 库的 DLL 版本的代码,因此,扩展 DLL 要求客户程序被动态连接到 MFC (AppWizard 默认设置 ) ,并且客户程序和扩展 DLL 要一致连接到 MFC DLL 的相同版本 (mfc42.dll mfcd42.dll ) 。扩展 DLL 很小,我们可以创建一个简单的扩展 DLL ,大约 10KB 左右,它的装载会很快。

²      如果我们需要一个 DLL ,并希望它可以被任何 Win32 编程环境 ( 包括 Visual Basic 5.0) 装载,那么我们必须使用正规 DLL 。这里有一个很大的限制就是,正规 DLL 可以导出 C 风格的函数,但不能导出 C++ 类、成员函数或重载函数,因为每一个 C++ 编译器都有自己修饰名字的方法。不过,我们可以在正规 DLL 内部使用 C++ ( 特别是 MFC 库的类 )

当我们创建 MFC 正规 DLL 时,我们可以选择静态连接或动态连接到 MFC 库。如果选择了静态连接, DLL 将包括所有它需要的 MFC 库代码的拷贝,因此它可以独立于 MFC 库。一个典型的 Release 版本静态连接的正规 DLL 大约为 144KB 左右。如果选择动态连接,大小可降到 17KB 左右,但必须保证适当的 MFC DLL 在目标机器上存在。

当我们指定 AppWizard 创建 DLL EXE 的类型时,编译器 #define 常量将按下表设置:

 

动态连接到共享的 MFC

静态连接到 MFC

正规 DLL

_AFXDLL _USRDLL

_USRDLL

扩展 DLL

_AFXEXT _AFXDLL

                 不支持                 

客户 EXE

_AFXDLL

没有定义常量

如果我们查看 MFC 源代码和头文件,将会看到大量的这些常量的 #ifdef 语句。这表明库代码的编译也是非常不同的,具体取决于我们产生工程时指定的类型。

2.1  共享的MFC DLLWindows DLL

²      如果我们使用共享 MFC DLL 选项创建一个 Windows Debug 目标的程序,则该程序将动态连接到下列一个或多个 (ANSI)MFC DLL

mfc42d.dll

核心 MFC

mfco42d.dll

ActiveX(OLE)

mfcd42d.dll

数据库类 (ODBC DAO)

Mfcn42.dll

Winsock WinInet

²      当创建 Release 目标时,程序只是动态连接到 mfc42.dll 。对这些 MFC DLL 的连接都是通过导入库隐式连接。我们也可以假定隐式连接到 Windows 里的 ActiveX ODBC DLL ,这种情况下,我们可以认为当装入用 Release 目标创建的客户时,所有这些 DLL 都被连接到了程序中,而不管客户是否使用了 ActiveX ODBC 特性。然而,实际情况并不是这样。通过一些创造性的手段,当这些函数中的某一个首先被调用时, MFC 会显示装入 ActiveX ODBC DLL( 通过调用 LoadLibrary) 。这样客户程序只是装入自己所需要的 DLL

2.2  MFC 扩展DLL ——导出类

如果扩展 DLL 只包含被导出的 C++ 类,那么我们可以很方便地创建和使用该 DLL 。创建 EX21A 示例程序 (P433) 的步骤显示了如何让 AppWizard 创建一个扩展 DLL 的框架。该框架只有 DllMain 函数,我们只要简单地把 C++ 类加到工程里。但有一件特殊的事情我们必须要做,即我们必须把宏 AFX_EXT_CLASS 加到类声明中,如下所示:

不仅对 DLL 工程中的 H 文件要作这样的修改,对客户程序使用的 H 文件同样也要作修改。换句话说, H 文件对于客户和 DLL 是一样的。该宏根据相应条件会产生不同的代码——在 DLL 里导出类,在客户程序里导入类。

2.3  MFC 扩展DLL 资源搜索的顺序

如果我们创建一个动态连接到 MFC 的客户程序,许多 MFC 库的标准资源 ( 错误信息字符串和打印预览对话框模板等 ) 都被保存在 MFC DLL (mfc42.dll mfcd42.dll ) ,但应用程序也有自己的资源。当程序调用一个 MFC 函数 ( Cstring::LoadString Cbitmap::LoadBitmap) 时,框架首先搜索 EXE 的资源,然后搜索 MFC DLL 的资源

如果程序包含一个扩展的 DLL ,并且 EXE 需要一个资源,则搜索顺序为:首先是 EXE 文件,然后是扩展 DLL ,再是 MFC DLL 。例如我们有一个字符串资源 ID ,在所有资源中它是唯一的,则 MFC 库将会找到该资源。如果在 EXE 文件和扩展 DLL 文件里有重复的字符串 ID ,则 MFC 库会装入 EXE 文件里的字符串。

如果扩展 DLL 装入一个资源,则搜索序列为:首先是扩展 DLL ,然后是 MFC DLL ,再是 EXE

说明: 如果需要的话,我们可以改变搜索序列。假定我们希望 EXE 代码首先搜索扩展 DLL 的资源,则可以使用下面的代码:

 

我们不能用 AfxGetInstanceHandle 代替 ::GetModuleHandle 。在一个扩展 DLL 里, AfxGetInstanceHandle 返回的是 EXE 的实例句柄,而不是 DLL 的句柄。

2.4  如何使用MFC 扩展DLL

u      将一个独立的类 MyClass ,做成一个扩展的 DLL

a)         首先制作一个单独的功能简单的类,内容如下:

b)         然后,运行 AppWizard 产生一个扩展的 DLL ,通过选择 MFC AppWizard(dll)->MFC Extension DLL->Finish ,工程名为 ex21a  

c)         MyClass.h MyClass.cpp 这两个文件拷贝到刚才创建的工程中,通过 Project->Add to Project->Files 。添加后,编辑 MyClass.h 文件如下:

d)         最后编译工程,得到了我们需要的两个文件 ex21a.dll ex21a.lib

u          DLL 测试客户程序

a)         运行 AppWizard 产生一个 Win32 控制台程序,通过选择 Win32 Console Application-> 工程名为 client-> 一个空白工程,然后再新建一个 C++ Source File ,文件名为 client 。完成后,在 client.cpp 文件中添加如下测试代码:

b)         修改设置,在 Project->Settings->General-> Microsoft Foundation Classes 中选择 Use MFC in a Shared DLL

c)         ex21a.dll ex21a.lib MyClass.h 三个文件拷贝到 client 工程目录下,类似上述相同的方法,将 MyClass.h 添加到工程中,并且在 Project->Settings->Link ,在 Object/library modules 中添加 ex21a.lib( 多个 lib 用空格分开 )

d)         修改 MyClass.h 文件的内容。当时我在调试的时候,出现了错误,需要小心。我们在扩展 DLL 工程中的 MyClass.h 文件中使用宏 AFX_EXT_CLASS 来声明导出类,而同时要在 client 工程中的 MyClass.h 文件中使用宏 AFX_EXT_CLASS 来声明导入类。但是在我编译 client 工程的时候问题出现了:

error C2079: 'CMyClass' uses undefined class 'AFX_EXT_CLASS'

提示 AFX_EXT_CLASS 没有定义,应该是少加头文件了。在网上 g 一下找到了一些相同的问题贴:

http://www.eggheadcafe.com/software/aspnet/29755654/problem-using-self-built.aspx

http://hi.baidu.com/qingdi963/blog/item/c75fa8501ffada878c5430b7.html/cmtid/24b28d832df3729af703a6c7#24b28d832df3729af703a6c7

http://msdn.microsoft.com/en-us/library/h5f7ck28.aspx (Extension DLLs)

http://msdn.microsoft.com/en-us/library/4fezhh3d.aspx (DLLHUSK Sample: Dynamically Links the MFC Library)

http://www.codeguru.com/Cpp/W-P/dll/article.php/c119 (Using one extension DLL in another)

 

解决方法如下,修改 MyClass.h 文件内容为:

方法 1

方法 2

e)         现在重新编译没问题了,可以得到如下的输出结果,即可以在 client 程序中成功地调用我们在扩展 DLL 中导出的类了。

main()

CMyClass::CMyClass()

SetValue(int n)

GetValue()

_a=100

 

wcdj 2010-1-6    下次总结 MFC 正规 DLL 的使用方法。


没有更多推荐了,返回首页