文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

VisualStudio 制作Dynamic Link Library动态链接库文件的详细过程

2022-11-13 13:52

关注

工具集

借助工具可以获得Dll库函数的访问地址,以下推荐两款工具以供使用:

Dependency Walker官网

Depends22_x64.zip

Dllexp-x64.zip

如何生成

__declspec(dllexport)

将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

__declspec(dllexport) RETURN_TYPE FUNCTION()

extern “C”

由于在制作DLL导出函数时由于C++存在函数重载

extern "C" {
  __declspec(dllexport) RETURN_TYPE FUNCTION(){
    ;
  }
}

如何使用

声明调用

注意DLL函数调用约定,必须一致

Example

假如我有一个函数接口如下:

//@ GETCOMCHECKSUM_API是一个宏定义
//@ #define GETCOMCHECKSUM_API __declspec(dllexport)
GETCOMCHECKSUM_API int fnGetComCheckSum(
                        const unsigned char*  iCsArray,       //[In]数组
                        const unsigned int    iCsSize,        //[In]数值
                        unsigned char&        ioCsValue)      //[In/Out]数值

那么我的调用应该这么写:

//@ __cdecl * 后面函数名可以自定义
typedef int(__cdecl *GetComCheckSum)(
            unsigned char const *,
            unsigned int,
            unsigned char&);

LoadLibrary

如果 LibFileName 没有包含一个路径,系统将按照:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在 PATH 环境变量中的目录等顺序查找文件。

如果函数操作成功,将返回装载 DLL 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如下表所示

错误代码             含义
      0             系统内存不够,可执行文件被破坏或调用非法
      2             文件没有被发现
      3             路径没有被发现
      5             企图动态链接一个任务错误或者有一个共享或网络保护错误
      6             库需要为每个任务建立分离的数据段  
      8             没有足够的内存启动应用程序  
      10            Windows  版本不正确  
      11            可执行文件非法或不是Windows  应用程序,或在.  EXE映像中有错误  
      12            应用程序为一个不同的操作系统设计(如  OS/2)  
      13            应用程序为  MS  DOS   4. 0  设计  
      14            可执行文件的类型不知道  
      15            试图装载一个实模式应用程序(为早期Windows  版本设计)
      16            试图装载包含可写的多个数据段的可执行文件的第二个实例  
      19            试图装载一个压缩的可执行文件(文件必须被解压后才能被装载)  
      20            DLL  文件非法
      21            应用程序需要  32  位扩展

Example

//@ 定义句柄
HINSTANCE hSnKLib;

//@ 获取链接库句柄       Getchecksum为dll的文件名 即 Getchecksum.dll
//@ 系统将会在当前目录下寻找名为Getchecksum.dll的文件
//@ 至于为什么使用_T("") ,_T是一个宏,作用是让你的程序支持Unicode编码,Windows使用两种字符集ANSI和UNICODE
hSnKLib = LoadLibrary(_T("Getchecksum"))

//@ 如果未能成功获取,抛出错误
if (hSnKLib == NULL)
{
    FreeLibrary(hSnKLib);
  	printf("LoadLibrary err\n");
  	getchar();
  	return 1;
}

GetProcAddress

大多数情况下,用函数名是一种更稳妥的选择。

如果该函数执行成功,则返回 DLL 中由参数 ProcName 指定的过程或函数的入口地址,否则返回 nil 。

Example

//前面我们在头文件中声明了下述函数
typedef int(__cdecl *GetComCheckSum)(
            unsigned char const *,
            unsigned int,
            unsigned char&);


//实例化并且获取函数地址
//fnGetComCheckSum为dll export出来的函数名,GetComCheckSum为我们引用时候声明的函数名
//这里做的工作就是将dll中函数与我们声明的联系到一块。
GetComCheckSum getcom = (GetComCheckSum)GetProcAddress(hSnKLib, "fnGetComCheckSum")

if (!getcom)
{
	FreeLibrary(hSnKLib);			//释放dll文件
	//Add your code here
}

FreeLibrary

Example

FreeLibrary(hSnKLib);

FAQS

Question 1: GetLastError获取错误代码127

问题描述:

问题定位:

解决方法两种:

EXPORTS
               ExportFunc

在这里插入图片描述

参考案例

GetProcAddress 使用注意事项

到此这篇关于VisualStudio 制作Dynamic Link Library动态链接库文件的文章就介绍到这了,更多相关VisualStudio动态链接库文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯