引子

动态链接库DLL文件不仅可以实现代码、资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言生成及调用DLL文件的方法。这儿开发工具选择的是小巧玲珑、启动迅速、精典一代的VC6.0环境,开发完成的目录结构如下图所示:

从目录结构中可以看出,这个例子在“E”盘的“MyDllCode”文件夹下创建了一个工作空间“MyDllCode.dsw”,工作空间中包含了两个项目,分别对应文件夹“MyDllSrc”和“MyDllTest”,其中, 前者是动态库的源代码工程,后者是测试代码(调试代码)工程,另外两个文件夹“Debug”和“Release”存放了生成的dll和exe文件。

下面依次详细说明动态库的创建及调试过程。

创建工作空间和项目

在VC6.0中,选择菜单“文件”-->“新建...”,在弹出的对话框中切换到“工作区”选项页,依次填写工作空间名称和位置信息,如下图所示:

工作区创建完成后,在VC6.0的左边控制面板上的“FileView”中显示当前的工作区名称为“MyDllCode”,包含的项目个数为0,在工作区上点右键,弹出的右键菜单中选择“添加新工程到工作空间...”,如下图所示:

在弹出的新建工程对话框中,选择工程类型为“Win32 Dynamic-Link Library”,工程名称为“MyDllSrc”,切记选中“添加到当前工作空间”,设置如下图所示:

在弹出的动态库配置对话框中,选择动态库类型为“一个空的DLL工程”即可,如下图所示,这样就完成了动态库源代码工程的创建。

同样的步骤,可以在工作空间中创建一个空的测试代码工程,与动态库源代码工程不同的是,工程类型选择“Win32 Console Appliction”的控制台程序,工程名称为“MyDllTest”。

工作空间的工程项目创建完成后,在VC6.0的左边控制面板上的“FileView”中显示情况如下图所示,此时包含2个工程项目,皆为空工程,未包含任何源代码文件:

设置工程输出目录

本例子既包含了动态库源代码工程,也包含了测试代码工程(即调试工程),为便于调试,将两个工程的输出文件目录设为同一个目录,如都设为与工作空间“MyDllCode.dsw”同一个目录,这样免去了将动态库dll文件手动拷到exe所在的目录下的麻烦。如对于“Debug”模式,在VC6.0中选择菜单“工程”-->“设置”或直接按“Alt+F7”快捷键,在弹出的工程对话框中选中工程“MyDllSrc”,在右侧的“连接”选项卡页修改输出文件名,由原来默认的“Debug/MyDllSrc.dll”修改为“../Debug/MyDll.dll”,即将生成的“MyDll.dll”文件修改为当前工程所在目录的上级目录的“Debug”文件夹中。同样方式修改工程“MyDllTest”文件输出目录为“../Debug/MyDllTest.exe”如下图所示:

对于“Release”模式,同上面方式完全相同,分别将工程“MyDllSrc”和“MyDllTest”的文件输出目录修改为“../Release/MyDll.dll”和“../Release/MyDllTest.exe”。

编写动态库工程源代码文件

新建头文件“MyDll.h”,在VC6.0中选择菜单“文件”-->“新建...”,在弹出的新建文件对话框中设置如下图所示,切记勾选“添加到工程”为“MyDllSrc”。

在新建的“MyDll.h”文件中,代码如下:

同样的方式,新建C++源文件“MyDll.cpp”,代码如下:

在动态库工程中,定义并导出了一个函数“MyFunc”,该函数产生等间隔的数据向量并返回数据向量的最后一个值和状态信息。在头文件中定义宏“EXPORT”为“extern "C" __declspec(dllexport)”,说明该函数调用约定为“C”方式,在其它编程语言中调用该函数时,调用约定必须一致。编译运行后即可得到在“E:\MyDllCode\Debug”目录下得到动态库文件“MyDll.dll”。

编写测试工程(调试工程)源代码文件

同编写动态库源代码文件类似,新建一个测试代码C++源文件“main.cpp”,切记勾选“添加到工程”为“MyDllTest”,代码如下:

代码中,通过“#include "../MyDllSrc/MyDll.h"”引入动态库的头文件,通过#pragma宏引入lib文件,这儿注意,路径必须设置正确。编译运行后即可得到在“E:\MyDllCode\Debug”目录下得到可执行程序“MyDllTest.exe”文件,运行结果如下:

可见,调试代码工程中,已经正确调用了“MyFunc”函数。

结论

上面给出了在VC6.0中创建及调试动态库的完整过程,在其它如VS2008、VS2010等IDE中,配置环节也是类似的。另外,需要说明的是,由于本例子将动态库工程和调试工程放在了同一个工作空间中,因此,在单步调试中,若在调用函数的行设置断点,则不需作额外的设置,会自动进入到动态库工程的源代码“MyDll.cpp”中,观察“MyFunc”函数的执行情况。

欢迎加关注,共同交流。

举报/反馈

c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序相关推荐

  1. vs2019加载调试动态库dll文件

    创建一个hello world 的空项目 根据dll文件时多少位的就配多少,然后点击运行 将dll相关的头文件全部拷贝到测试项目中 将dll文件和lib也同时拷在测试文件的cpp同目录下 将编写dll ...

  2. java 调用c so_JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 //用JNI实现2 //实例 ...

  3. C#调用C/C++动态库Dll时几个注意事项:PInvoke错误

    经常需要封装一些C/C++函数放入动态库中给C#程序调用,通常情况下直接写成如下形式即可: C#封装调用: [DllImport("depressor.dll")] //错误调用方 ...

  4. C#总结:C#调用C++的动态库Dll遇到的问题[动态库调用/结构体指针调用/union共同体定义]

    记录使用C#调用C++的生成的DLL手柄键盘驱动库包括****.sys(驱动文件)和****.dll(库文件)的全部问题. C#调用C++的库有两种:静态调用和动态调用 静态调用,使用.net 提供的 ...

  5. 库文件、静态库(lib)与动态库(dll)的生成与使用

    静态库 程序编译一般需经预处理.编译.汇编和链接几个步骤.在应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到 ...

  6. C# VC6调用VC6的动态库DLL

    C# VC6调用VC6的动态库DLL 一 VC创建动态库 1. DLL的创建 启动VC6.0, 新建一个"Win32 Dynamic-Link Library"工程,选择" ...

  7. C#.net调用动态库dll注意事项

    C#.net调用动态库dll注意事项 本文主要描述作者在工作中所遇到技术难点及问题,最后提出相关的解决方案 场景 公司有个业务需求涉及到ID读卡器,构建成在ID卡读卡器一刷ID卡,系统就自动显示其ID ...

  8. Unity加载C语言32dll,Unity3d 载入 C++/CLI (托管方式c++) 的动态库(DLL)

    Unity3d 载入 C++/CLI (托管模式c++) 的动态库(DLL) 由于最近开发游戏寻路A*使用非常频繁.所以是逻辑上的瓶颈. c#又比c++慢一倍.所以决定上c++.这样算一种优化吧.哈哈 ...

  9. java调用C或者C++动态库dll

    java调用C或者C++动态库dll,本文章使用的是IntelliJ IDEA Community Edition 2021.2.3版本测试的 1.新建项目 linjie.demo,添加类HelloL ...

最新文章

  1. java通过异常处理错误,java基础之通过错误处理异常
  2. 小程序wx.createInnerAudioContext()获取不到时长问题
  3. network中的请求信息,headers中的每一项分别是什么意义?
  4. 关于 Blazor Server Side 的一些杂项, 感想
  5. 【CodeForces - 701D】As Fast As Possible(二分,模拟,数学公式)
  6. Spark应用日志级别设置
  7. H3C Comware V7新增的RBAC
  8. 计算机及网络信息安全管理制度,计算机、网络管理及信息安全管理制度
  9. 打造自己的博客(一)利用VuePress完成博客整体搭建,并支持评论和自动发布
  10. 基于单片机仿指针显示的电子时钟设计(毕业设计资料)
  11. N-gram详解分析
  12. Android 自定义View—月有阴晴圆缺
  13. Cobalt Strike|Beacon原理浅析
  14. java poi导出excel插入图片
  15. python3常用标准库
  16. 亨利·明茨伯格(Henry Mintzberg)质量管理学大师
  17. Linux远程连接Mysql配置
  18. Ubuntu17.10 安装WPS
  19. websocket系列:ws和wss的区别
  20. 米家的扫地机器人是灰色_米家扫地机器人怎么清理灰尘盒

热门文章

  1. 弱口令上传shell_emlog后台拿shell
  2. linux 终端会话连接,如何在 Linux 中使用 Asciinema 进行录制和回放终端会话
  3. 修改FTP密码的三种方法
  4. 20165221 实验五 网络编程与安全
  5. InputFormat和OutPutFormat
  6. OpenGL_17_点光源
  7. Angularjs 设置全局变量的3种方法
  8. 应用在vs的ide调试环境下运行顺利,但是在bin目录直接运行exe报错的问题
  9. emacs之配置8,gdb调试设置
  10. 通过rpm包安装、配置及卸载mysql的详细过程.