UE5 C++ 第三方动态库的使用

一. 首先要拷贝对应的 第三方库

bin里有dll动态库,include里有动态库需要的头文件。

二.在Target.cs里,进行设置

头文件前面的路径为公共路径

设置需要一起打包的三方库文件

三.加载这个库

FPlatformProcess::GetDllHandle将他解析为 任意类型,用void* 接受。

复制代码
	//加载dll
	FString tmpDllPath = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/bin/x64/bass.dll"); //解析这个库
	BassDllHandle = FPlatformProcess::GetDllHandle(*tmpDllPath);
	if (!BassDllHandle) return;

再用FPlatformProcess::GetDllExport.传入这个解析出来库的指针,和你要使用的函数名的TEXT类型,比如TEXT("BASS_Init")。返回也要进行指针转换,转换为对应的函数指针。没想到函数指针在这里居然被用到。

cpp 复制代码
	//初始化bass
	BassInitTOFunc BassInitTO = (BassInitTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_Init")); //拿到这个库的某个函数(初始化)
	if (!BassInitTO) return;
	bool isBassInit = BassInitTO(-1, 44100, 0, NULL, 0);
	if (!isBassInit) return;

我们用函数指针BassInitTOFunc接住返回值。它的定义如下

cpp 复制代码
typedef BOOL(*BassInitTOFunc)(int, DWORD, DWORD, HWND, const void*);

这里是给 函数指针起了 叫BassInitToFunc的别名。可以看这篇文章的第三部分

C语言指针进阶(一)------深入详解"函数指针"与"指针函数"-CSDN博客

四.来回用库里的函数达到播放音乐效果

cpp 复制代码
#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "bass.h"
#include "DLLManager.generated.h"

/**
 * 
 */
 //音效
#define AUDIO_BASS_BGM				"DiscoFlow.wav"
typedef BOOL(*BassInitTOFunc)(int, DWORD, DWORD, HWND, const void*);
typedef HSTREAM(*BassCreateTOFunc)(BOOL, const void*, QWORD, QWORD, DWORD);
typedef BOOL(*BassPlayTOFunc)(DWORD, BOOL);

UCLASS()
class LEARNPROJECT_API UDLLManager : public UObject
{
	GENERATED_BODY()
public:
	void InitDLL();
	//BGM
	bool PlayBGMTO();
	void* BassDllHandle;//Bass dll
	HSTREAM BassBGM;
};
cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.


#include "DLLManager.h"

void UDLLManager::InitDLL()
{
	//加载dll
	FString tmpDllPath = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/bin/x64/bass.dll"); //解析这个库
	BassDllHandle = FPlatformProcess::GetDllHandle(*tmpDllPath);
	if (!BassDllHandle) return;

	//初始化bass
	BassInitTOFunc BassInitTO = (BassInitTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_Init")); //拿到这个库的某个函数(初始化)
	if (!BassInitTO) return;
	bool isBassInit = BassInitTO(-1, 44100, 0, NULL, 0);
	if (!isBassInit) return;

	//创建bgm文件流
	BassCreateTOFunc BassCreateTO = (BassCreateTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_StreamCreateFile")); //拿到这个库的某个函数(加载流文件)
	if (BassCreateTO)
	{
		FString AudioFile = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/Audios/") + AUDIO_BASS_BGM;
		BassBGM = BassCreateTO(FALSE, TCHAR_TO_UTF8(*AudioFile), 0, 0, BASS_SAMPLE_LOOP);
	}
}

bool UDLLManager::PlayBGMTO()
{
	if (!BassDllHandle) return false;

	BassPlayTOFunc BassPlayTO = (BassPlayTOFunc)FPlatformProcess::GetDllExport(BassDllHandle, TEXT("BASS_ChannelPlay"));  //拿到这个库的某个函数(单通道播放)
	if (BassPlayTO)
		return BassPlayTO(BassBGM, true);

	return false;
}

测试

cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

class UDLLManager;

UCLASS()
class LEARNPROJECT_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	//音效管理
	UPROPERTY()
	UDLLManager* AudioManager;

};
cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.


#include "MyActor.h"
#include "DLLManager.h"

// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	 AudioManager = NewObject<UDLLManager>(this);
	 if (AudioManager)
	 {
		 AudioManager->InitDLL();
		// AudioManager->InitAudioManager();
		 AudioManager->PlayBGMTO();
	 }
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}
相关推荐
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148115 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小小龙学IT6 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研8 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈9 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011169 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据10 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡10 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai10 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库