[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)

来源:互联网 发布:ubuntu终端命令大全 编辑:程序博客网 时间:2024/05/22 08:08

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/78586478


接着上文《DLL之旅1 : 将程序打包成DLL》,现在调用动态链接库有两种方法。

1.静态加载

需要文件(一个都不能少):

  • 头文件qShareDll.h
  • 编译生成的lib文件TestDll.lib – 编译需要
  • 编译生成的dll文件TestDll.dll – 运行需要

头文件qShareDll.h

#ifndef _Q_SHARE_DLL_H#define _Q_SHARE_DLL_Hextern "C" _declspec(dllexport) double qAdd(double a, double b);extern "C" _declspec(dllexport) double qSub(double a, double b);// extern "C" 解决函数名由于不同编译器造成的名字匹配问题// 通常c++编译器编译时会对函数进行改名,而c编译器不会// _declspec(dllexport)说明该函数为导出函数/*  如果函数用"_stdcall"进行修饰,在动态引用的时候,要对"函数指针"也要进行"_stdcall"修饰__stdcall:Windows API默认的函数调用协议extern "C" _declspec(dllexport) double _stdcall qAdd(double a, double b);extern "C" _declspec(dllexport) double _stdcall qSub(double a, double b);*/#endif

调用源文件main.cpp

#include <iostream>using namespace std;#include "qShareDll.h"#pragma comment(lib,"TestDll.lib") //int main(){    double a, b;    cout << "静态加载" << endl;    while (true)    {        cout << "input Number a: ";        cin >> a;        cout << "input Number b: ";        cin >> b;        cout << "a + b = " << qAdd(a, b) << endl;        cout << "a - b = " << qSub(a, b) << endl << endl;    }    return 0;}

2.动态加载

需要文件: 就一个DLL,需要用Depend工具,查看函数名(但这是不够的),还需要知道函数是怎么声明的(不然无法定义函数指针)。

这里写图片描述

调用源文件main.cpp

#include <iostream>using namespace std;#include <Windows.h>int main(){    double a, b;    cout << "动态加载" << endl;    HINSTANCE handle = LoadLibraryA("TestDll.dll"); //用于加载dll    //如果当初头文件中有 "_stdcall" 修饰    //typedef double(_stdcall *ADDPROC)(double, double);    //typedef double(_stdcall *SUBPROC)(double, double);    typedef double(*ADDPROC)(double, double);    typedef double(*SUBPROC)(double, double);    // GetProcAddress第二个参数有两种方法:      // 1、通过DLL中的函数名      // 2、通过Depend工具中Ordinal索引值来查看 - 编译不通过放弃(而且确实不好用)    ADDPROC MyAdd = (ADDPROC)GetProcAddress(handle, "qAdd");    SUBPROC MySub = (SUBPROC)GetProcAddress(handle, "qSub");      //SUBPROC MySub = (ADDPROC)GetProcAddress(handle, MAKEINTRESOURCE(2));  //编译不通过-放弃    cout << "input Number a: ";    cin >> a;    cout << "input Number b: ";    cin >> b;    cout << "a + b = " << MyAdd(a, b) << endl;    cout << "a - b = " << MySub(a, b) << endl << endl;    FreeLibrary(handle);    return 0;}

方便的代码

条件编译,方便。

#include <iostream>using namespace std;//#define FLG_CMP_STATIC #ifdef FLG_CMP_STATIC //静态加载DLL-Lib    #include "qShareDll.h"    #pragma comment(lib,"TestDll.lib")    int main()    {        double a, b;        cout << "静态加载" << endl;        while (true)        {            cout << "input Number a: ";            cin >> a;            cout << "input Number b: ";            cin >> b;            cout << "a + b = " << qAdd(a, b) << endl;            cout << "a - b = " << qSub(a, b) << endl << endl;        }        return 0;    }#else //动态加载DLL    #include <Windows.h>    int main()    {        double a, b;        cout << "动态加载" << endl;        HINSTANCE handle = LoadLibraryA("TestDll.dll");                    //用于加载dll        //typedef double(_stdcall *ADDPROC)(double, double);        //typedef double(_stdcall *SUBPROC)(double, double);        typedef double(*ADDPROC)(double, double);        typedef double(*SUBPROC)(double, double);        // GetProcAddress第二个参数有两种方法:          // 1、通过DLL中的函数名          // 2、通过Depend工具中Ordinal索引值来查看          ADDPROC MyAdd = (ADDPROC)GetProcAddress(handle, "qAdd");        //SUBPROC MySub = (ADDPROC)GetProcAddress(handle, MAKEINTRESOURCE(2));  // MAKEINTRESOURCE LPCSTR        SUBPROC MySub = (SUBPROC)GetProcAddress(handle, "qSub");  // MAKEINTRESOURCE LPCSTR        while (true)        {            cout << "input Number a: ";            cin >> a;            cout << "input Number b: ";            cin >> b;            cout << "a + b = " << MyAdd(a, b) << endl;            cout << "a - b = " << MySub(a, b) << endl << endl;        }        FreeLibrary(handle);        return 0;    }#endif // FLG_CMP_STATIC

Next计划

用Matlab的CS-function 去调用DLL,实现xPC可以编译多个共用的mexw文件

to be continue …

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办 狗牙齿碰到红了怎么办 加拿大学生签背景调查了怎么办 gpa不到3该怎么办英国 内地学生赴港签证怎么办 学生去日本旅游签证怎么办 澳洲未婚妻签需要单身证明怎么办 高院收到申诉材料怎么办? 辞职出国留学后社保怎么办 高三数学40来分怎么办 论文查重表格内容重复怎么办 榕树叶子掉光了怎么办 2017江苏高考2c怎么办 高考刚过三本线怎么办 江苏高考选修有d怎么办 西安地铁卡丢了怎么办 酒后头痛怎么办快速缓解疼痛 孕妇感冒头痛怎么办快速缓解疼痛 投稿后发现文章有错误怎么办 如有一方不同意离婚怎么办 孩子上课时注意力不集中怎么办 幼儿上课时注意力不集中怎么办 孩子读初中不爱读书怎么办 老师需要刺激孩子家长怎么办