首页 > 软件开发 > 编程语言 >

C++编写 动态链接库dll 和 调用dll

来源:互联网 2023-03-17 00:14:48 版权归原作者所有,如有侵权,请联系我们

编写属于自己的动态链接库(dynamic link library)已越来越受大多数编程爱好者的青睐,因为它的作用是很广泛的!作为一位编程爱好者,编写动态链接库是必不可少的!4A2办公区 - 实用经验教程分享!

工具/原料

  • VS2013
  • depends.exe(主要可以查看dll里的函数)

方法/步骤

  • 1

    打开VS2013,新建一个C 工程(不是MFC!),命名为 "mydll",接着选中 "DLL","导出符号",直接完成,如图:4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 2

    这时,看到的是默认初始化好了的代码,我们把一些不必要的删掉(其实那些是用来参考的,实际编写时删掉也无大碍)。4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    然后在“mydll.h”头文件里添加 下列代码:4A2办公区 - 实用经验教程分享!

    extern "C" MYDLL_API int GetMaxNumber(int, int);4A2办公区 - 实用经验教程分享!

    extern "C" MYDLL_API void ShowMsg(char *, char*);4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    在“mydll.cpp”源文件添加 如下图所示的功能实现代码:4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 3

    OK!现在代码简简单单的写完了,那如何编译成 .dll 文件呢?4A2办公区 - 实用经验教程分享!

    单击菜单栏 >"生成">"生成 mydll",编译成功。(注意,不是调试下的开始执行...)4A2办公区 - 实用经验教程分享!

    然后找到工程的目录所在路径,DeBug目录下找到 那个生成的 “mydll.dll”(现在是不是很激动呢?!O(∩_∩)O)4A2办公区 - 实用经验教程分享!

    接下来还有更重要的事情呢!4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 3相关内容未经许可获取自百度经验
  • 4

    在重新修建一个工程,这次是一个C 下的控制台应用程序来测试编写的dll是否成功运行!!4A2办公区 - 实用经验教程分享!

    工程名为“test_mydll”4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 5

    添加一个.cpp源文件,添加如下代码:4A2办公区 - 实用经验教程分享!

    (注意,要把 mydll.dll 放到 生成的.exe 同一目录下)4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    #include windows.h>4A2办公区 - 实用经验教程分享!

    全局...4A2办公区 - 实用经验教程分享!

    typedef int( *pGetMaxN)(int, int);//定义一个函数指针类型4A2办公区 - 实用经验教程分享!

    typedef void( *pShowMsg)(char *, char *);4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    main()...4A2办公区 - 实用经验教程分享!

    //动态加载 dll4A2办公区 - 实用经验教程分享!

    HMODULE hModule = LoadLibrary(L"mydll.dll");4A2办公区 - 实用经验教程分享!

    if (!hModule)4A2办公区 - 实用经验教程分享!

    {4A2办公区 - 实用经验教程分享!

    cout "Error!" endl;4A2办公区 - 实用经验教程分享!

    }4A2办公区 - 实用经验教程分享!

    //获取函数 GetMaxNumber 的地址4A2办公区 - 实用经验教程分享!

    pGetMaxN pgetm = (pGetMaxN)GetProcAddress(hModule, "GetMaxNumber");4A2办公区 - 实用经验教程分享!

    cout pgetm(10, 5) endl;4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    //获取函数 ShowMsg 的地址4A2办公区 - 实用经验教程分享!

    pShowMsg pshowm = (pShowMsg)GetProcAddress(hModule, "ShowMsg");4A2办公区 - 实用经验教程分享!

    pshowm("内容", "标题");4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    //释放4A2办公区 - 实用经验教程分享!

    FreeLibrary(hModule);4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    测试成功!!是不是很激动呢?!4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 6

    这里要提醒一下哦,上面的是动态加载dll的,所以,就也是说,我们一直都没有使用原来的dll工程生成了那个“mydll.lib”的文件!4A2办公区 - 实用经验教程分享!

    那么现在以静态调用dll 也是可行的,但 要把那个.lib文件和 .h头文件放到 与.cpp 同一个目录下(注意,这个不是.dll文件,所以可以放在 与.cpp同一个目录下!!!!)4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 7

    然后,可以放心的吧以前动态调用的代码注释掉啦,添加新代码,看图吧4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    运行成功!4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 8

    恩~~没错,编写dll到此大概基本上完成了,但是,一个动态链接库要在其他平台上也要能调用才算成功吧?!4A2办公区 - 实用经验教程分享!

    所以,我在这里就用易语言测试下能不能成功的调用.....(⊙o⊙)…4A2办公区 - 实用经验教程分享!

    一经测试,结果惨不忍睹,what?这究竟是为什么???为什么还会出现这个错误?这里我就不多说了...4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 9

    既然这样,那就得找到解决的办法!4A2办公区 - 实用经验教程分享!

    我用depends载入那个dll看了下,函数格式正常。那问题又出现在哪,最后我在原来的dll工程里添加了一个.def文件!4A2办公区 - 实用经验教程分享!

    于是把连个函数导出去!再次编译!!4A2办公区 - 实用经验教程分享!

    (如果仔细观察的小伙伴会发现,我在 头文件和源文件 多添加了个 _stdcall 这是调用约定,详细须百度...)4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 10

    于是我再一次把 mydll.dll 放到和易语言源文件一个目录下,再次运行!现在,终于成功了!既然这样,在C 下还能调用成功吗?结果是可以的。4A2办公区 - 实用经验教程分享!

    只是要稍微修改一下,也要加 _stdcall:4A2办公区 - 实用经验教程分享!

    (要注意我写的注释,不要混淆了)4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    //动态4A2办公区 - 实用经验教程分享!

    typedef int( _stdcall *pGetMaxN)(int, int);//定义一个函数指针类型4A2办公区 - 实用经验教程分享!

    typedef void( _stdcall *pShowMsg)(char *, char *);4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    //静态4A2办公区 - 实用经验教程分享!

    extern "C" __declspec(dllimport) int _stdcall GetMaxNumber(int, int);4A2办公区 - 实用经验教程分享!

    extern "C" __declspec(dllimport) void _stdcall ShowMsg(char *, char*);4A2办公区 - 实用经验教程分享!

    4A2办公区 - 实用经验教程分享!

    这样运行效果也是一样成功的!4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

    C  编写 动态链接库dll 和 调用dll4A2办公区 - 实用经验教程分享!

  • 11

    总之,如果编写的dll文件中函数有 "_stdcall ",就必须把这个函数 添加到 .def 导出文件中!!!4A2办公区 - 实用经验教程分享!

    要注意 那个.def 函数导出文件的强大!!4A2办公区 - 实用经验教程分享!

    好了,至此结束了4A2办公区 - 实用经验教程分享!

  • 注意事项

    • dll源代码分享地址:http://pan.baidu.com/s/1bUAApK

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!4A2办公区 - 实用经验教程分享!


    标签: 编程语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号