• DLL模块:C++在VS下创建、调用dll


    1.dll的优点

    代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。
    暴露了源代码;多份拷贝,造成存储浪费;
    容易与程序员的“普通”代码发生命名冲突;
    更新功能模块比较困难,不利于问题的模块化实现;
    实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进制级别”的代码复用。使用二进制级别的代码复用一定程度上隐藏了源代码,对于缓解代码耦合现象起到了一定的作用。这样的复用被称为“黑盒复用”。
    说明:实现“黑盒复用”的途径不只dll一种,静态链接库甚至更高级的COM组件都是。

    2.dll的创建

    我在原文基础上做了一点修改,把那个类给去掉了。。

    参考程序原文:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx
    新建“Win32项目”,选择应用程序类型为"DLL”,其他默认。

    添加头文件testdll.h

     1 //testdll.h
     2 #ifdef TESTDLL_EXPORTS  
     3 #define TESTDLL_API __declspec(dllexport)   //这个修饰符使得函数能都被DLL输出,所以他能被其他应用函数调用
     4 #else  
     5 #define TESTDLL_API __declspec(dllimport)   //这个修饰符使得编译器优化DLL中的函数接口以便于被其他应用程序调用
     6 #endif  
     7 namespace MathFuncs  
     8 {  
     9     // This class is exported from the testdll.dll  
    10     // Returns a + b  
    11     extern TESTDLL_API double Add(double a, double b);
    12 
    13     // Returns a - b  
    14     extern TESTDLL_API double Subtract(double a, double b);
    15 
    16     // Returns a * b  
    17     extern TESTDLL_API double Multiply(double a, double b);
    18 
    19     // Returns a / b  
    20     // Throws const std::invalid_argument& if b is 0  
    21     extern TESTDLL_API double Divide(double a, double b);
    22 }

    添加cpp文件

     1 // testdll.cpp : 定义 DLL 应用程序的导出函数。
     2 #include "stdafx.h"
     3 #include "testdll.h"  
     4 #include <stdexcept>  
     5 using namespace std;  
     6 
     7 namespace MathFuncs  
     8 {  
     9     double Add(double a, double b)  
    10     {  
    11         return a + b;  
    12     }  
    13 
    14     double Subtract(double a, double b)  
    15     {  
    16         return a - b;  
    17     }  
    18 
    19     double Multiply(double a, double b)  
    20     {  
    21         return a * b;  
    22     }  
    23 
    24     double Divide(double a, double b)  
    25     {  
    26         if (b == 0)  
    27         {  
    28             throw invalid_argument("b cannot be zero!");  
    29         }  
    30         return a / b;  
    31     }  
    32 }

    编译就会生成对应的dll文件,同时也会生成对应的lib文件。

    以下为调用的步骤:

    在DLL工程中能找到相应工程名的.h  .lib  .dll

    然后把这三个文件添加到需要调用他的工程的文件夹里面,在编译的代码前面加上预处理语句

    #pragma comment(lib,"testdll.lib")

    然后包涵头文件#include "testdll.h"

    以下给出一个demo:

     1 //demo.cpp
     2 #include <iostream>  
     3 #include "testdll.h"
     4 #pragma comment(lib,"testdll.lib")
     5 using namespace std;  
     6 
     7 int main()  
     8 {  
     9     double a = 7.4;  
    10     int b = 99;  
    11 
    12     cout << "a + b = " <<  
    13         MathFuncs::Add(a, b) << endl;  
    14     cout << "a - b = " <<  
    15         MathFuncs::Subtract(a, b) << endl;  
    16     cout << "a * b = " <<  
    17         MathFuncs::Multiply(a, b) << endl;  
    18     cout << "a / b = " <<  
    19         MathFuncs::Divide(a, b) << endl;  
    20     return 0;  
    21 }
    ——现在的努力是为了小时候吹过的牛B!!
  • 相关阅读:
    Django模型层Meta内部类详解
    jquery checkbox的相关操作——全选、反选、获得所有选中的checkbox
    c# 委托与异步调用
    DataTable转成List集合
    c# winform 自动升级
    C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常
    C#创建无窗体的应用程序
    sql 一个表的字段更新至另一个字段的方法
    datagridview 获取选中行的索引
    CHECKEDLISTBOX用法总结
  • 原文地址:https://www.cnblogs.com/pingge/p/3153571.html
Copyright © 2020-2023  润新知