栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

UE5导入第三方动态链接库dll

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UE5导入第三方动态链接库dll

Build.cs文件里面加上"Projects"模块,要不然报错

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

class FOpenFacePlusModule : public IModuleInterface
{
public:

	
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;

	
	void* OpenFaceHandle;
};

加载模块这里添加个指针,存dll的句柄

// Copyright Epic Games, Inc. All Rights Reserved.

#include "OpenFacePlus.h"
//dll
#include "Core.h"
#include "Modules/ModuleManager.h"
#include "Interfaces/IPluginManager.h"

#define LOCTEXT_NAMESPACE "FOpenFacePlusModule"

void FOpenFacePlusModule::StartupModule()
{
	//加载dll
	FString BaseDir = IPluginManager::Get().FindPlugin("OpenFacePlus")->GetBaseDir();
	FString LibraryPath;
#if PLATFORM_WINDOWS
	LibraryPath = FPaths::Combine(*BaseDir, TEXT("Binaries/ThirdParty/OpenFaceDll.dll"));
#endif // PLATFORM_WINDOWS
	FPlatformProcess::PushDllDirectory(*(FPaths::ProjectDir() / TEXT("Plugins/OpenFacePlus/Binaries/ThirdParty/")));
	OpenFaceHandle = !LibraryPath.IsEmpty() ? FPlatformProcess::GetDllHandle(*LibraryPath) : nullptr;
	if (OpenFaceHandle)
	{
	}
	else
	{
		FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("ThirdPartyLibraryError", "Failed to load example OpenFaceDll library"));
	}
}

void FOpenFacePlusModule::ShutdownModule()
{
	//卸载dll
	FPlatformProcess::FreeDllHandle(OpenFaceHandle);
	OpenFaceHandle = nullptr;
}

#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FOpenFacePlusModule, OpenFacePlus)

然后这就加载好了,下面是调用

#include "Misc/MessageDialog.h"
#include "Modules/ModuleManager.h"
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"

创建函数指针,或者用头文件更好

typedef int (*runOpenFace)(int argc, char** argv);
FModuleManager& fmode = FModuleManager::Get();
	FOpenFacePlusModule* mode = (FOpenFacePlusModule*)fmode.GetModule("OpenFacePlus");

	FString procName = "runOpenFace";
	runOpenFace ssss = (runOpenFace)FPlatformProcess::GetDllExport(mode->OpenFaceHandle, *procName);
int a = ssss();
	UE_LOG(LogTemp, Warning, TEXT("OpenFaceDll return :%d"), a);

这样就从模块那边获取到dll句柄了,然后就调用就好了

这里说一下静态的库

需要lib,头文件如果很多的话容易报错的,尤其是opencv,dilb之类的库,和ue有点冲突,静态链接很容易被坑到

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号