dll文件编写、查看和调用

一、dll文件编写

1.在visual studio 2015中创建一个win32控制台程序,选择dll项目

2. dll文件中的函数暴露的方式有两种。

  • 在项目中创建模块定义文件*.def,dll暴露的函数名。允许其他人直接查看def文件来了解该dll提供了几个可用的函数(问题:重载函数是否只用在模块定义文件中声明一次?)
  • 创建一个头文件,在头文件中,使用extern “C”方式暴露dll的函数名。(只在cpp文件中使用该方式会造成dllimport时找不到函数的链接错误,即便dumpbin能将dll中的函数名列出来)使用方式如下:
    ** extern “C” _declspec(dllexport) 返回值类型 函数名(形参列表);
    ** 例:extern "C" _declspec(dllexport) int inference(char * ImgPath, char * modelPath);

二、dll文件查看

1. 为了保证在cmd中使用dumpbin命令,需要首先在系统变量中添加VS相关的用户变量

  • Path:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
  • Path:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE

2. 使用Visual Studio 2015中带有的dumpbin.exe程序来查看dll的相关信息。在开始菜单中Visual Studio 2015文件夹下打开VS2015开发人员命令提示(cmd也可以)

查看picturePredict.dll的导出函数:
  • dumpbin /exports F:\deploy\picturePredict\x64\Release\picturePredict.dll
    dll文件编写、查看和调用_第1张图片
查看dll文件的位数信息:
  • dumpbin /headers F:\deploy\picturePredict\x64\Release\picturePredict.dll
  • 检查FILE HEADER VALUES的值中,是否标明32位dll文件。如果没有则是64位dll文件。
    dll文件编写、查看和调用_第2张图片

三、dll文件调用

以对picturePredict.lib的调用为例

1.创建一个win32控制台程序

2.文件依赖配置,右键项目,打开属性页

  • 配置属性->常规->字符集:使用unicode字符集。需要和dll字符集类型保持一致。
  • 配置属性->VC++目录->包含目录。添加控制台程序依赖的外部库的头文件目录路径(*\include)
  • 配置属性->VC++目录->库目录。添加主程序依赖的库的dll文件路径(也可以直接吧dll放在程序根目录下)
  • 配置属性->链接器->输入,附加依赖项中,添加对picturePredict.lib的引用
  • 配置属性->链接器->输入->模块定义文件。添加相关*.def文件。如果dll生成时,外部函数暴露使用方式为def文件定义。
  • 配置属性->链接器->所有选项,附加依赖项中,添加对picturePredict.lib的引用

3.相关文件引入

  • lib文件所在路径如果没有在配置属性->VC++目录->库目录中声明,也可以直接将lib文件放置在程序cpp文件所在文件夹下。
  • dll文件直接放置在项目路径\x64\Release\文件夹下。
  • 如果使用创建头文件的方式来暴露dll中的函数,需要将头文件也添加在项目中。方式有两种,一种是在配置属性->VC++目录->包含目录中添加相关的头文件。一种是将项目头文件放置在程序cpp文件所在文件夹下,然后在主程序的头文件中,include该文件。

4.dll文件中的函数引入和使用

  • 使用命令 extern “C” __declspec(dllexport) 返回值类型 函数名(形参列表);
    例如:extern "C" __declspec(dllexport) int inference(char * ImgPath, char * modelPath);
  • 导入成功后,该函数可以当成普通函数直接使用。

你可能感兴趣的:(C++)