【UE4】调用外部链接库:dll动态库

本文介绍了在UE4中两种加载DLL的方法,并提供了详细的代码示例。第一种方法通过FPlatformProcess接口绑定DLL及其中的函数,第二种方法适用于无法通过第一种方法引用DLL的情况。此外,还介绍了如何在build.cs中声明DLL作为运行时依赖性。

加载

  • 方式一
    // dll内的函数引用声明
    typedef void(*_Initial)(
    char* thisPCID,
    char* thisConnectioninfo,
    char* thisExpVersion,
    char* thisSessionlD
    );
    
    void *DLLHandle;
    _Initial DLL_Initial;
      //加载
    bool UDLLTest::DLL_Init() {
        FString filePath = FPaths::Combine(*FPaths::GamePluginsDir(), TEXT("DLL/"), TEXT("test.dll"));
        if (FPaths::FileExists(filePath)) {
            UE_LOG(LogTemp, Log, TEXT("%s"), *filePath);
            // 绑定dll
            DLLHandle = FPlatformProcess::GetDllHandle(*filePath);
            if (DLLHandle != NULL) {
                DLL_Initial=NULL;
               
                //绑定函数
                FString procName = "Initial"; // dll里的函数名
                DLL_Initial = (_Initial)FPlatformProcess::GetDllExport(DLLHandle, *procName); 
                if(DLL_Initial != NULL){
                    UE_LOG(LogTemp, Log, TEXT("DLL_Initial import succ"));
                    return true;
                }     
            }
        }
        return false;
    }
    
    //释放
    void UDLLTest::DLL_Free() {
        if(DLLHandle !=NULL){
            DLL_Initial = NULL;
            FPlatformProcess::FreeDllHandle(DLLHandle );
            DLLHandle = NULL;
        }
    }
    
  • 方式二 (当使用方法一引用不到 dll 的时候,可以尝试使用该方法)
    SetDllDirectory(*filePath);
    DllHandle = LoadLibrary(TEXT("test.dll"));
    ...
    

运行时依赖性

  • 打包游戏时为在可执行文件旁暂存第三方DLL,可在 build.cs中声明其为运行时依赖性。
    RuntimeDependencies.Add(Path.Combine(PluginDirectory, "Binaries/Win64/Foo.dll"));
    
  • 此操作假设DLL已存在于给定目录中,插件将在该位置手动进行加载。若希望在编译时将DLL复制到可执行文件使用的相同输出目录,可通过重载 RuntimeDependencies.Add 方法执行。
    RuntimeDependencies.Add("$(TargetOutputDir)/Foo.dll", Path.Combine(PluginDirectory, "Source/ThirdParty/bin/Foo.dll"));
    

参考

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值