软件安全之动态链接库的使用 Libzplay 播放音乐

本博客通过实验介绍了如何使用C语言结合Libzplay动态链接库实现音乐播放器,分别讲解了隐式和显式链接DLL的方式。在隐式链接中,详细描述了基础步骤、拓展设计,包括添加阻塞语句、实现播放、暂停和停止功能。而在显式链接部分,展示了动态加载DLL和获取函数入口的步骤。最后,对比了两种链接方式的适用场景和优缺点。
摘要由CSDN通过智能技术生成

实验 1 动态链接库的使用

  1. 实验说明

Libzplay 是遵循 GPL 协议的开源库,它集成了 mp3、flac、ac3、aac、wav等多种音频格式的解码器和编码器,提供了面向 C/C++、C#、Delphi 等多种编程语言的接口,仅需 3 行代码(创建播放资源,打开文件,开始播放)便可实现音乐播放功能。

  1. 实验目的

本实验通过 Libzplay 提供的 C 语言接口,实现简单的音乐播放器,以此学习 DLL 的隐式和显式加载方式。

  1. 实验原理

课程第 2 讲基础知识

  1. 实验环境

Windows 桌面系统,Visual Studio 6.0 及以上版本,libzplay SDK

  1. 实验内容
    • 隐式链接
    • 显示链接

练习 1 隐式链接 DLL

1、基础步骤
  1. 创建控制台应用程序项目

打开 VS,选择空项目模板创建控制台应用程序,命名为 zplay-im,然后向新建项目中添加源程序文件impilicit.cpp,编写 main 函数。

  1. 拷贝头文件和库文件

将 libzplay 库中的头文件 libzplay.h 和库文件 libzplay.lib 到 zplay-im 项目所在的目录。

  1. 编写播放程序

使用 libzplay C 语言接口播放音乐文件,至少需要依次调用如下 3 个函数:

ZPLAY_HANDLE player = zplay_CreateZPlay();
zplay_OpenFile(player, "homeland.mp3", sfAutodetect);
zplay_Play(player);

完整的程序如下

#include <stdio.h>
#include <stdlib.h>
#include "libzplay.h"
// 导入lib,否则报错 LNK2019 无法解析的外部符号
#pragma comment(lib,"libzplay")

int main()
{
   
	ZPLAY_HANDLE player = zplay_CreateZPlay(); // 创建实例,libzplay申请各类资源
	zplay_OpenFile(player, "homeland.mp3", sfAutodetect); //打开音乐文件
	zplay_Play(player); // 播放音乐文件
	system("pause");
	return 0;
}
  1. 编译程序

编译成功后,将 libzplay 库中的 DLL 文件 libzplay.dll 拷贝到编译生成的可执行文件所在目录,或者将该 DLL 文件放入 DLL 加载过程要搜索的目录。歌曲文件以impilicit.cpp位置为原点,相对目录寻址。

  1. 运行程序仅编写上述代码,程序运行后将立即退出,应如何添加代码使其正常播放音乐?

    • 可以在底部加入一条scanf语句,getchar()语句等,使其处于一直等待输入的状态,程序自然也不会停止;
    • 使用while(true)也可以实现程序一直进行;
    • system("pause");也可以使得程序暂停。
2、拓展设计
  1. 根据 libzplay 提供的数据类型定义和函数接口原型,设计较为完整的音乐播放器,实现播放过程的暂停、播放、停止等控制功能。

  2. 播放完毕后,需要做清理工作:

    • zplay_OpenFile 和 zplay_Close 是相对应的 2 个函数,打开的音乐文件不再播放时需要关闭;
    • zplay_CreateZPlay 和 zplay_DestroyZPlay 是相对应的 2 个函数,libzplay 申请的各类资源,不再需要时需要销毁。
附带播放、暂停、停止的完整程序
#include <stdio.h>
#include <stdlib.h>
#include "libzplay.h"
// 导入lib,否则报错 LNK2019 无法解析的外部符号
#pragma 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值