实验 1 动态链接库的使用
- 实验说明
Libzplay 是遵循 GPL 协议的开源库,它集成了 mp3、flac、ac3、aac、wav等多种音频格式的解码器和编码器,提供了面向 C/C++、C#、Delphi 等多种编程语言的接口,仅需 3 行代码(创建播放资源,打开文件,开始播放)便可实现音乐播放功能。
- 实验目的
本实验通过 Libzplay 提供的 C 语言接口,实现简单的音乐播放器,以此学习 DLL 的隐式和显式加载方式。
- 实验原理
课程第 2 讲基础知识
- 实验环境
Windows 桌面系统,Visual Studio 6.0 及以上版本,libzplay SDK
- 实验内容
-
- 隐式链接
-
- 显示链接
练习 1 隐式链接 DLL
1、基础步骤
- 创建控制台应用程序项目
打开 VS,选择空项目模板创建控制台应用程序,命名为 zplay-im,然后向新建项目中添加源程序文件impilicit.cpp
,编写 main 函数。
- 拷贝头文件和库文件
将 libzplay 库中的头文件 libzplay.h
和库文件 libzplay.lib
到 zplay-im 项目所在的目录。
- 编写播放程序
使用 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;
}
- 编译程序
编译成功后,将 libzplay 库中的 DLL 文件 libzplay.dll
拷贝到编译生成的可执行文件所在目录,或者将该 DLL 文件放入 DLL 加载过程要搜索的目录。歌曲文件以impilicit.cpp
位置为原点,相对目录寻址。
-
运行程序仅编写上述代码,程序运行后将立即退出,应如何添加代码使其正常播放音乐?
- 可以在底部加入一条scanf语句,getchar()语句等,使其处于一直等待输入的状态,程序自然也不会停止;
- 使用while(true)也可以实现程序一直进行;
system("pause");
也可以使得程序暂停。
2、拓展设计
-
根据 libzplay 提供的数据类型定义和函数接口原型,设计较为完整的音乐播放器,实现播放过程的暂停、播放、停止等控制功能。
-
播放完毕后,需要做清理工作:
-
- zplay_OpenFile 和 zplay_Close 是相对应的 2 个函数,打开的音乐文件不再播放时需要关闭;
- zplay_CreateZPlay 和 zplay_DestroyZPlay 是相对应的 2 个函数,libzplay 申请的各类资源,不再需要时需要销毁。
附带播放、暂停、停止的完整程序
#include <stdio.h>
#include <stdlib.h>
#include "libzplay.h"
// 导入lib,否则报错 LNK2019 无法解析的外部符号
#pragma