zoukankan      html  css  js  c++  java
  • 【原创】在VS2012中采用C++中调用DLL中的函数(4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3)

    但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google“vs2012 c++调用dll”时,发现了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx

     在这篇指南和之前3篇文章的综合指引下,笔者完成了在VS2012中编写DLL并成功调用DLL的例程,下面将这个过程一步一步详细描述出来:

    1、首先,打开VS2012 ,在菜单栏中依次选择:FILE-->NEW-->Project;

    2、在 “新建项目”对话框左边窗格中,展开“Installed”-->Templates-->VisualC++ -->Win32”从右侧窗格中选择“Win32 Console Application”(有blog说到Win32Project也可以,笔者未尝试)。

    3、在下方窗格“Name”中填写AddDLL(工程名称),“Location”中选择工程的生成目录,Solution中 为“Create new solution”,“Solution name”中填写建立的解决方案的名称“AddDLL” 。确认OK

    笔者在此选择工程名称和解决方案名称相同,这样有时会造成误导,所以建议新建工程时注意区分名称。

    4、“win32 application wizard 中“(Win32 应用程序向导)对话框的“概述”页上,选择“next 下一步”按钮。

    5、因为需要在这个工程中生成DLL文件,所以需要在右侧窗格中勾选 ”Dll选项“,在”Additional Options“中可以选择

     ”Precompiled header“和”Security Development Lifecycle(SDL)“选项这样在生成的”AddDLL.cpp“文本中就会出现”#include "stdafx.h"“字样

    6、选择”Finish“ 创建结束

    下面开始 讲述如何向动态链接库中添加类:

    1. 在菜单栏上:FILE-->NEW-->File,这是会弹出一个对New File话框
    2. 在左侧窗格中选择Visual C++后,右侧窗格内容会发生变化,在右侧窗格中选择”Header File(.h)“然后选择”Open“
    3. 出现Header1.h文件,,然后选择常用菜单栏”Save“按钮,将其保存为”AddDLL.h“
    4. 添加下面代码至”AddDLL.h“文件
    // AddDLL.h

    #ifdef ADDDLL_EXPORTS
    #define ADDDLL_API __declspec(dllexport) 
    #else
    #define ADDDLL_API __declspec(dllimport) 
    #endif

    注:当定义了 MATHFUNCSDLL_EXPORTS 符号时,MATHFUNCSDLL_API 符号将在此代码中的成员函数声明中设置 __declspec(dllexport) 修饰符。 此修饰符使函数能作为 DLL 导出,以供其他应用程序调用。 当 MATHFUNCSDLL_EXPORTS 未定义时,MATHFUNCSDLL_API 会在成员函数声明中定义 __declspec(dllimport) 修饰符。 此修饰符能够使编译器优化从 DLL 导入的用于其他应用程序的函数。 默认情况下,生成 MathFuncsDll 项目时会定义 MATHFUNCSDLL_EXPORTS。 有关详细信息,请参阅 dllexport、dllimport
     

     5.在”AddDLL.h“文本中继续填写如下代码,建立名为”MatFuncs“一个基础类,这个基础类中只写了一个算术运算:两个整数相加

     namespace MathFuncs

    {
        class AddDLL 
        {
        public:
            //returns a+b
            static ADDDLL_EXPORTS_API int Add(int a,int b);

        };    //注意:MathFuncclass声明这里;不可少

    }

     然后在“解决方案资源管理器”的“AddDLL”项目中,在“源文件”文件夹中,打开”AddDLL.cpp“文本,在源文件中实现 MathFuncs 的功能。 代码应类似如下:

     #include "stdafx.h"

    #include "AddDLL.h"

    using namespace std;
    namespace MathFuncs
    {
        int MathFuncs::Add(int a,int b)
        {
            return a+b;
        }
    }

     6.在菜单栏中“BUILD -->BUILD Solution (F7)或者Bulid AddDLL“生成解决方案,编译动态链接库,至此DLL已经生成,生成位置在上面几篇文章中有详细讲述,就是在工程目录下的Debug文件夹中

     =======================================================================

     下面开始创建引用 DLL 的应用程序

    引用DLL的程序的工程,可以同编译动态链接库的工程建立在同一个Solution下,也可以不建立在同一个Solution下,不在同一个solution下的方法见文章在C++中调用DLL中的函数(3)

    下面讲的是建立在同一个Solution:AddDLL下,在同一个解决方案下时,需要有一个设置,如果不设置,就会导致”Unable to find XXX.DLL“错误.

     步骤如下:

    1. 为了创建一个项目引用你刚刚创建好的DLL,在菜单栏中选择" 文件>新建>项目"

    2. 在左窗格中的“Visual C++”下,选择“Win32”。

    3. 在中间窗格中,选择“Win32 控制台应用程序”

    4. 在“名称”框中为项目指定名称,例如,testDLL。 从“解决方案”旁边的下拉列表中选择“添加到解决方案”。 这会将新项目添加到包含 AddDLL.DLL 的同一个解决方案中。 选择“确定”按钮。

    5. “Win32 应用程序向导”对话框的“概述”页上,选择“下一步”按钮。

    6. 在“应用程序设置”页上的“应用程序类型”下,选择“控制台应用程序”。

    7. 在“应用程序设置”页上的“附加选项”下,清除“预编译头”复选框。

    8. 选择“完成”按钮创建项目。 

    在应用程序中使用类库的功能

    1. 在创建一个控制台应用程序后,一个空的程序已经为你创建好了。 源文件的名称与之前选择的名称相同,名为“tesDLL.cpp”。

    2. 若要使用您 DLL 中创建的算术例程,必须引用 DLL。 在"Solution Explorer "(解决方案资源管理器)中选择 testDLL 项目,然后在菜单栏上,选择Project-->Reference。 在“testDLL Propeities Pages属性页”对话框中,展开“Commen Propeities通用属性”节点,选择“Framework and Reference 框架和引用”,然后选择“Add New Reference添加新引用”按钮。 有关“引用”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

    3. “添加引用”对话框列出了可以引用的库。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在“项目”选项卡上,选中“AddDLL”旁边的复选框,然后选中“确定”按钮。

    4. 若要引用 DLL 的头文件,必须修改包含的目录路径。 为此,请在“Propeities Pages属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“General常规”。 在“Addentional Include Directories附加包含目录”旁边,指定AddDLL.h 头文件所在位置的路径。 可以使用相对路径(例如 ..AddDLL),然后选择“确定”按钮。

    5. 现在即可在此应用程序中使用MathFuncs 类。 使用以下代码替换“testDll.cpp”的内容:

    #include "stdafx.h"
    #include "AddDLL.h" //在这里需要将本工程的testDLL.h添加到工程中,否则include下会出现红色波浪线
    #include <iostream> //这里的include <iostream>需要同using name space std配合使用
    using namespace std;
    int main()
    {
    int a = 3;
    int b = 4;
    cout<< MathFuncs::AddDLL::Add(a,b)<<endl;
    getchar();//让consol能够保持住窗口
    }

     6.通过在菜单栏上一依次选择“Build --Build testDLL”

    下面运行testDLL,需要有一个 比较细微的设置:

    1. 确保选择“testDLl”作为默认项目。 在“解决方案资源管理器”中,选择testDLL,然后在菜单栏上依次选择“项目”、“设为启动项目”。

    2. 若要运行项目,请在菜单栏上依次选择“调试”、“开始执行(不调试)”。 控制台输出结果 7.

  • 相关阅读:
    袁创:如何成为黄金程序猿
    划重点!新版电子病历评级标准讲解会上6大核心要点
    台湾医院信息化见闻录
    2500行代码实现高性能数值表达式引擎
    HIT创业感言:只有长寿的企业才有持续价值
    袁创:寂静的战争
    相约南湖,南京都昌信息亮相南湖HIT论坛
    我们是谁?南京都昌信息科技有限公司!
    医疗链的系列谈 第一篇 基本概念研究
    论电子病历控件的现状和发展方向
  • 原文地址:https://www.cnblogs.com/woshitianma/p/3683495.html
Copyright © 2011-2022 走看看