您的位置:首页 > 其它

动态链接库的创建和使用

2016-02-14 14:06 429 查看
一、创建新的动态链接库(DLL)项目

从“File”菜单中,选择“New”,然后选择“Project…”。

如下图:



在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

在“模板”窗格中,选择“Win32 Console Application”。

为项目选择一个名称,如 MathFuncsDll,并将其键入“Name:”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“Solution Name:”字段。

如下图:








二、向动态链接库添加类

若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。 将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。 在“模板”窗格中选择“头文件(.h)”。 为头文件选择一个名称,如 MathFuncsDll.h,并单击“添加”。
将显示一个空白文件。

添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。 代码应与以下内容类似:
// MathFuncsDll.h

namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);

// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);

// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);

// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}


请注意此代码方法声明中的 __declspec(dllexport) 修饰符。 这些修饰符使 DLL 能够导出该方法以供其他应用程序使用(Windows与Linux所不同的地方!!!!!!!)。

在源文件中实现“MyMathFuncs”的功能。 代码应与以下内容类似:

// MathFuncsDll.cpp
// compile with: /EHsc /LD

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}

double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}

double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}

double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}

return a / b;
}
}


若要将项目生成为 DLL,请从“项目”菜单中选择 MathFuncsDll“属性…”。 在左窗格中,选择“配置属性”下的“常规”。 在右窗格中,将“配置类型”更改为“动态库(.dll)”。 单击“确定”保存更改。

编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。 这样就创建了一个可供其他程序使用的 DLL。 如图:



生成的dll文件的地址:




三、创建引用动态链接库的应用程序

若要创建将引用并使用刚创建的动态链接库的应用程序,请从“File”菜单中选择“New”,然后选择“Project…”。

在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

在“模板”窗格中,选择“Win32 Console Application”。

为项目选择一个名称(如 MyExecRefsDll),并将其键入“名称”字段。 从“解决方案”旁边的下拉列表中选择“Add to Solution”。 这会将新项目添加到该动态链接库所属的同一个解决方案中。

如图:







四、在控制台应用程序中使用类库的功能

如何在编译器(vs2008)里设置调用别人写好的lib和dll

步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径
            (这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.)
             (若不设置,编译报错:无法打开***文件,或者在调用处#include<...dll头文件相对路径...>)
         2.Project->properties->c/c++->general->additional include directories 添加包含文件
(若采用在调用处#include<...dll头文件相对路径...>的方法则不用设置)
            Project->properties->linker->general->additional library directories 添加库文件
            Project->properties->linker->input->additional additional dependencies添加用到的lib
            (编译生成.dll的同时必然也有一个.lib;这一步也可以在代码中显示调用 #pragma comment(lib, "***.lib") )
             (若不添加,连接报错:无法解析的外部符号)
         3.将dll文件拷贝到工程debug文件下(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)切记第三条,让我排查了一上午,当然最好把所有输出目录定位到一个文件下面。

现在,可以在应用程序中使用“MyMathFuncs”类了。 使用以下代码替换“MyExecRefsDll.cpp”的内容:
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib

#include <iostream>

#include "MathFuncsDll.h"

using namespace std;

int main()
{
double a = 7.4;
int b = 99;

cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dll visual studio