当前位置: 首页 > news >正文

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

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

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

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

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

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

三.加载这个库

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

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

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

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

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

typedef BOOL(*BassInitTOFunc)(int, DWORD, DWORD, HWND, const void*);

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

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

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

#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();//BGMbool PlayBGMTO();void* BassDllHandle;//Bass dllHSTREAM BassBGM;
};
// Fill out your copyright notice in the Description page of Project Settings.#include "DLLManager.h"void UDLLManager::InitDLL()
{//加载dllFString tmpDllPath = FPaths::GameSourceDir() + TEXT("LearnProject/BassSDK/bin/x64/bass.dll"); //解析这个库BassDllHandle = FPlatformProcess::GetDllHandle(*tmpDllPath);if (!BassDllHandle) return;//初始化bassBassInitTOFunc 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;
}

测试

// 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 propertiesAMyActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;//音效管理UPROPERTY()UDLLManager* AudioManager;};
// 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);}

http://www.dtcms.com/a/361105.html

相关文章:

  • 【数据库】openGauss 6.0 单机自动化安装最佳实践
  • MTK-Android13-实现拷贝预置资源到vendor分区下
  • Java全栈学习笔记27
  • 深度解析条件编译:#ifdef与#ifndef的本质区别与应用实践
  • Dify中使用SearXNG
  • 子串:滑动窗口最大值
  • Macbook Air M4 笔记本 ChatTTS 初体验
  • 总线矩阵的原理
  • 番外篇 | YOLO-FireAD:通过注意力逆残差模块与双池化模块融合实现高精度火灾检测
  • GitHub CLI (gh) 全面指南:终端中的 GitHub 工作流革命
  • 前端页面性能优化
  • JavaScript 性能优化实战技术
  • 99、23种设计模式之组合模式(8/23)
  • Map + 函数式接口的策略模式
  • 控制系统仿真之PID校正-利用PID控制器、PID调节器实现(九)
  • Coze源码分析-工作空间-项目开发-后端源码
  • Python爬虫实战:研究 Lines, bars and markers 模块,构建电商平台数据采集和分析系统
  • 【软件开发工程师の校招秘籍】
  • nginx-realip问题解决方案
  • AI 智能体架构中的协议设计三部曲:MCP → A2A → AG-UI
  • 基于单片机宠物项圈/宠物防丢失设计
  • VMware pro16(许可证)+centos 7超详细安装教程
  • Go语言入门学习笔记
  • 如何将照片从电脑传输到安卓设备
  • GitHub 宕机自救指南:应急解决方案与替代平台
  • LeetCode 165. 比较版本号 - 优雅Java解决方案
  • 【JavaScript】async/await 与 Fetch 传参,PUT,PATCH,文件上传,批量删除等前端案例
  • 《WINDOWS 环境下32位汇编语言程序设计》第10章 内存管理和文件操作(1)
  • 在Lumerical FDTD中,磁偶极子通常用于激发TE模式,而电偶极子用于激发TM模式(文心一言)
  • PyCharm中Debug在状态栏显示运行到光标处(run to cursor)