创建和使用您自己的动态链接库(C++)_第1页
创建和使用您自己的动态链接库(C++)_第2页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、创建和使您的动态链接库(C+)此分步演练演如何使 Visual Studio IDE 创建的动态链接库 (DLL),这些库是 Microsoft C+ (MSVC) 编写的。然后,它展了如何使另个C+应程序中的 DLL。DLL(在基于 UNIX 的操作系统中也称为共享库)是最有的 Windows 组件类型之。你可以使它们来共享代码和资源,并缩应的。DLL 甚可以更轻松地服务和扩展应。在本演练中,您将创建个实现某些数学函数的 DLL。然后,你将创建个使 DLL 中的函数的控制台应。您还将了解 Windows DLL中使的些编程技术和约定。本演练涵盖以下任务:在 Visual Studio 中创建

2、个 DLL 项。将导出的函数和变量添加到 DLL。在 Visual Studio 中创建控制台应项。在控制台应中使从 DLL 导的函数和变量。运已完成的应。与静态链接库样,DLL 导出变量、函数和资源。客户端应导名称以使这些变量、函数和资源。与静态链接库不同,Windows 在加载时或运时将应中的导连接到 DLL 中的导出,不是在链接时连接它们。Windows 需要不属于标准C+编译模型中的额外信息来建这些连接。MSVC 编译器实现了些特定于 Microsoft 的扩展,以C+提供此额外信息。我们边边解释这些扩展。本演练创建两个 Visual Studio 解决案;个于成 DLL,另个于成客户

3、端应。该 DLL 使 C 调约定。它可以从其他编程语编写的应程序调,只要平台,调约定和链接约定匹配即可。客户端应使隐式链接,其中 Windows 在加载时将应链接到DLL。此链接允许应调 DLL 提供的函数,就像静态链接库中的函数样。本演练不涵盖某些常见情况。该代码不显其他编程语使C+ DLL。它不演如何,也不演如何使在运时不是在加载时加载DLL。请放,您可以使MSVC和VisualStudio来执所有这些事情。尽管 DLL 的代码是C+编写的,但我们对导出的函数使了 C 样式的接。这主要有两个原因:先,许多其他语持导C风格函数。客户端应不必以C+编写。其次,它避免了与导出的类和成员函数相关的

4、些常见陷阱。导出类时很容易出现难以诊断的错误,因为类声明中引的所有内容都必须具有也导出的实例化。此限制适于 DLL,但不适于静态库。如果您的类是普通的旧数据样式,则不应遇到此问题。有关 DLL 的详细信息的链接,请参阅。有关隐式链接和显式链接的详细信息,请参阅。有关创建C+ DLL 以于使 C 语链接约定的编程语的信息,请参阅。有关如何创建于 .NET 语的 DLL 的信息,请参见。先决条件运 Microsoft Windows 7 或更版本的计算机。我们建议使最新版本的 Windows 以获得最佳开发体验。Visual Studio 的副本。有关如何下载和安装 Visual Studio 2

5、015 的信息,请参阅。使定义安装来安装C+编译器和具,因为它们默认情况下未安装。了解使 Visual Studio IDE 的基础知识。如果你以前使过 Windows 桌应,则可能会跟上步伐。有关简介,请参阅 。对C+语的够基本原理的理解。别担,我们不会做任何太复杂的事情。创建DLL项在这组任务中,您将为 DLL 创建个项,添加代码并成它。先,启动 Visual Studio IDE,并在需要时登录。说明略有不同,具体取决于您使的 Visual Studio 版本。请确保在页左上的控件中选择了正确的版本。在 1. 在菜单栏上,选择件新建项。2. 在新建项对话框的左窗格中,展开已安装模板,选择

6、VisualC+,然后在中窗格中选择Win32 控制台应程序。MathLibrary在名称编辑框中输以指定项的名称。保留默认的位置和解决案名称值。将解决案设置为创建新解决案。选中创建解决案的录(如果未选中)。3. 选择确定按钮以关闭新建项对话框并启动Win32 应程序向导。4. 选择下步按钮。在应程序设置页上的应程序类型下,选择DLL。5. 选择完成按钮以创建项。向导完成解决案后,可以在 Visual Studio 的解决案资源管理器窗中看到成的项和源件。现在,此 DLL 的功能不多。接下来,您将创建个头件来声明 DLL 导出的函数,然后将函数定义添加到 DLL 以使其更有。 1. 若要为函数

7、创建头件,请在菜单栏上选择项添加新项。MathLibrary.h2. 在添加新项对话框的左窗格中,选择可视C+。在中窗格中,选择头件 (.h)。指定称。作为头件的名3. 选择添加按钮以成空头件,该件将显在新的编辑器窗中。4. 将头件的内容替换为以下代码:C+复制/ n 1, F(n-2) + F(n-1)/ Initialize a Fibonacci relation sequence/ Get the current value in the sequence.extern CMATHLIBRARY_APIunsigned long long fibonacci_current();/ G

8、et the position of the current value in the sequence.extern CMATHLIBRARY_APIunsigned fibonacci_index();此头件声明些函数以成义斐波那契数列,给定两个初始值。调以成熟悉的斐波那契数列。fibonacci_init(1, 1)请注意件顶部的预处理器语句。DLL 项的新项模板将添加到定义的预处理器宏中。在此例中,VisualStudio 定义了构建MathLibrary DLL _EXPORTSMATHLIBRARY_EXPORTS定义宏时,宏将在函数声明上设置修饰符。此修饰符告诉编译器和链接器从

9、DLL 导出函数或变量以供其他应程序使。when 未定义(例如,当客户端应程序包含头件时),将修饰符应于声明。此修饰符优化函数或变量在应程序中的导。有关详细信息,请参阅 MATHLIBRARY_EXPORTSMATHLIBRARY_API_declspec(dllexport)MATHLIBRARY_EXPORTSMATHLIBRARY_API_declspec(dllimpo向 1. 在编辑器窗中,选择 MathLibrary 的选项卡.cpp(如果该选项卡已打开)。如果没有,请在解决案资源管理器中,双击 MathLibrary 项的源件件夹中的MathLibrary.cpp将其打开。2.

10、在编辑器中,将 MathLibrary.cpp 件的内容替换为以下代码:C+复制/ DLL internal state variables:/ Initialize a Fibonacci relation sequenceconst unsigned long long a,const unsigned long long b)/ check to see if wed overflow result or positionif (ULLONG_MAX - previous_ 0)/ otherwise, calculate next sequence valueprevious_ +=

11、current_;std:swap(current_, previous_);/ Get the current value in the sequence.unsigned long long fibonacci_current()/ Get the current index position in the sequence.unsigned fibonacci_index()return index_;若要验证到前为是否切正常,请编译动态链接库。若要编译,请选择菜单栏上的成成解决案。DLL 和相关编译器输出放置在解决案件夹正下名为Debug的件夹中。如果创建发布版本,则输出将放在名为发布

12、的件夹中。输出应如下所:输出复制1- Build started: Project: MathLibrary, Configuration: Debug Win32 -1MathLibrary.cpp1dllmain.cpp1 Creating library C:UsersusernameSourceReposMathLibraryDebugMathLibrary.lib and object C:UsersusernameSourceReposMathLibraryDebugMath1MathLibrary.vcxproj - C:UsersusernameSourceReposMathL

13、ibraryDebugMathLibrary.dll1MathLibrary.vcxproj - C:UsersusernameSourceReposMathLibraryDebugMathLibrary.pdb (Partial PDB)= Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped =恭喜,您已经使 Visual Studio 创建了个 DLL!接下来,你将创建个使 DLL 导出的函数的客户端应。创建使DLL的客户端应创建 DLL 时,请考虑客户端应可能如何使它。若要调函数或访问由 DLL 导出的数据,客户端源代码必须在编译时

14、具有可的声明。在链接时,链接器需要信息来解析函数调或数据访问。DLL 导库中提供此信息,导库是个包含有关如何查找函数和数据的信息的件,不是实际的代码。在运时,DLL 必须可供客户端使,位于操作系统可以找到的位置。论是你的还是来第三的,你的客户端应项都需要条信息才能使 DLL。它需要查找声明 DLL 导出的标头、链接器的导库以及 DLL 本。种解决案是将所有这些件复制到客户端项中。对于在客户端开发过程中不太可能更改的第三 DLL,此法可能是使它们的最佳式。但是,当您同时成 DLL 时,最好避免重复。如果创建正在开发的 DLL 件的本地副本,则可能会意外更改个副本中的头件,但不会更改另个副本中的头

15、件,或者使过期的库。若要避免代码不同步,建议将客户端项中的包含路径设置为直接包含 DLL 项中的 DLL 头件。此外,在客户端项中设置库路径以包含 DLL 项中的 DLL 导库。最后,将成的 DLL 从 DLL 项复制到客户端成输出录中。此步骤允许客户端应使成的相同DLL 代码。在 1. 若要创建使你创建的 DLL 的C+应,请在菜单栏上选择件新建项。2. 在新建项对话框的左窗格中,选择已安装模板下的Win32 Visual C+。在中窗格中,选择Win32 控制台应程序。在名称编辑框中指定项的名称MathClient。保留默认的位置和解决案名称值。将解决案设置为创建新解决案。选中创建解决案的

16、录(如果未选中)。3. 选择确定按钮以关闭新建项对话框并启动Win32 应程序向导。在Win32 应程序向导对话框的概述页上,选择下步按钮。4. 在应程序设置页上的应程序类型下,选择控制台应程序(如果尚未选择)。5. 选择完成按钮以创建项。向导完成后,将为您创建个最的控制台应程序项。主源件的名称与您之前输的项名称相同。在此例中,它被命名为 MathClient.cpp。您可以成它,但它尚未使您的 DLL。接下来,若要在源代码中调 MathLibrary 函数,您的项必须包含MathLibrary.h件。可以将此头件复制到客户端应项中,然后将其作为现有项添加到项中。此法可能是第三库的不错选择。但

17、是,如果同时处理 DLL 和客户端的代码,则头件可能会不同步。若要避免此问题,请将项中的其他包含录路径设置为包含原始标头的路径。将 1. 右键单击解决案资源管理器中的MathClient节点以打开属性页对话框。2. 在配置下拉框中,选择所有配置(如果尚未选中)。3. 在左窗格中,选择配置属性C/C+常规。4. 在属性窗格中,选择其他包含录编辑框旁边的下拉控件,然后选择编辑。5. 双击其他包含录对话框的顶部窗格以启编辑控件。或者,选择件夹图标以创建新条。6. 在编辑控件中,指定 MathLibrary.h 头件位置的路径。可以选择省略号 (.) 控件以浏览到正确的件夹。还可以输从客户端源件到包含

18、 DLL 头件的件夹的相对路径。如果按照说明将客户端项放在与 DLL 不同的解决案中,则相对路径应如下所:.MathLibraryMathLibrary如果 DLL 和客户端项位于同解决案中,则相对路径可能如下所:.MathLibrary当 DLL 和客户端项位于其他件夹中时,请调整相对路径以匹配。或者,使省略号控件浏览该件夹。7. 在其他包含录对话框中输头件的路径后,选择确定按钮。在属性页对话框中,选择确定按钮以保存更改。现在,您可以包含 MathLibrary.h 件,并在客户端应程序中使它声明的函数。使以下代码替换 MathClient.cpp 的内容:C+复制int main()/ I

19、nitialize a Fibonacci relation sequence.fibonacci_init(1, 1);std:cout fibonacci_index() : fibonacci_current() std:endl; while (fibonacci_next();/ Report count of values written before overflow.std:cout fibonacci_index() + 1 Fibonacci sequence values fit in an unsigned 64-bit integer. 链接器输。在属性窗格中,选择其

20、他依赖项编辑框旁边的下拉控件,然后选择编辑。MathLibrary.lib4. 在其他依赖项对话框中,将添加到顶部编辑控件的列表中。5. 选择确定返回到属性页对话框。6. 在左窗格中,选择配置属性链接器常规。在属性窗格中,选择其他库录编辑框旁边的下拉控件,然后选择编辑。7. 在其他库录对话框的顶部窗格中双击以启编辑控件。在编辑控件中,指定 MathLibrary.lib 件位置的路径。默认情况下,它位于 DLL 解决案件夹正下名为调试的件夹中。如果创建发布版本,则该件将放在名为发布的件夹中。可以使该宏,以便链接器可以找到您的 DLL,论您创建哪种类型的成。如果按照说明将客户端项放在与 DLL

21、项不同的解决案中,则相对路径应如下所:$(IntDir).MathLibrary$(IntDir)如果 DLL 和客户端项位于其他位置,请调整要匹配的相对路径。8. 在其他库录对话框中输库件的路径后,选择确定按钮返回到属性页对话框。选择确定以保存属性更改。客户端应现在可以成功编译和链接,但它仍然没有运所需的切。当操作系统加载你的应时,它会查找 MathLibrary DLL。如果在某些系统录、环境路径或本地应程序录中找不到 DLL,则加载将失败。根据操作系统的不同,您将看到如下错误消息:避免此问题的种法是将 DLL 复制到包含客户端可执件的录中,作为成过程的部分。可以向项中添加成后事件,以添加将 DLL 复制到成输出录的命令。此处指定的命令仅在 DLL 丢失或已更改时才复制该 DLL。它使宏根据成配置在调试或发布位置之间复制。1. 右键单击解决案资源管理器中的MathClient节点,然后选择属性以打开属性页对话框。2. 在配置下拉框中,选择所有配置(如果尚未选中)。3. 在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论