委托delegate的使用-动态加载DLL控件

本文介绍了一种通过委托方法动态加载DLL文件的方法,解决了路径不确定的问题。详细讲解了使用LoadLibrary、GetProcAddress和FreeLibrary等API加载DLL的过程,并提供了具体的代码示例。

上次利用Dllimport加载DLL控件时,却只能加载固定路径的DLL文件。对于一些路径不确定的DLL文件来说,这种方法是无法完全满足要求的。
或许有些人会认为DLL文件都可以利用引用方法来加载并进行开发,可对于非托管了DLL控件是无法实现的。这时,唯一的办法就是使用委托方法。
首先:要使用下面的类

以上文章Google上找到了。本人测试时,完全可以使用

void UTFGroupItemList::RefreshGroupItemList() { if (RefreshHandle.IsValid()) { return; } RefreshGroupItems(); RefreshHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateWeakLambda(this, [this](float DeltaTime) { if (!GetVisibleItems().IsEmpty()) { InventoryItems->SetListItems(VisibleListItems); ChangeSelectedSlot(); RefreshHandle.Reset(); return true; } return false; })); } 这是刷新道具列表的具体代码实现,讲解一下这段代码,下面还提供调用堆栈: > UnrealEditor-Force.dll!UTFGroupItemList::RefreshGroupItemList() 行 18 C++ UnrealEditor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) 行 7192 C++ UnrealEditor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) 行 2175 C++ UnrealEditor-UnLua.dll!FFunctionDesc::CallUE(lua_State * L, int NumParams, void * Userdata) 行 229 C++ UnrealEditor-UnLua.dll!Class_CallUFunction(lua_State * L) 行 1280 C++ [外部代码] UnrealEditor-UnLua.dll!FFunctionDesc::CallLuaInternal(lua_State * L, void * InParams, FOutParmRec * OutParams, void * RetValueAddress) 行 459 C++ UnrealEditor-UnLua.dll!FFunctionDesc::CallLua(lua_State * L, int LuaRef, void * Params, UObject * Self) 行 164 C++ UnrealEditor-UnLua.dll!UnLua::FDelegateRegistry::Execute(const ULuaDelegateHandler * Handler, void * Params) 行 220 C++ UnrealEditor-UnLua.dll!ULuaDelegateHandler::ProcessEvent(UFunction * Function, void * Parms) 行 79 C++ [内联框架] UnrealEditor-CommonUI.dll!TScriptDelegate<FNotThreadSafeNotCheckedDelegateMode>::ProcessDelegate(void *) 行 448 C++ UnrealEditor-CommonUI.dll!TMulticastScriptDelegate<FNotThreadSafeDelegateMode>::ProcessMulticastDelegate<UObject>(void * Parameters) 行 913 C++ [内联框架] UnrealEditor-CommonUI.dll!UCommonTabListWidgetBase::FOnTabSelected_DelegateWrapper(const TMulticastScriptDelegate<FNotThreadSafeDelegateMode> &) 行 159 C++ [内联框架] UnrealEditor-CommonUI.dll!UCommonTabListWidgetBase::FOnTabSelected::Broadcast(FName) 行 51 C++ UnrealEditor-CommonUI.dll!UCommonTabListWidgetBase::HandleTabButtonSelected(UCommonButtonBase * SelectedTabButton, int ButtonIndex) 行 445 C++ UnrealEditor-CommonUI.dll!UCommonTabListWidgetBase::execHandleTabButtonSelected(UObject * Context, FFrame & Stack, void * const Z_Param__Result) 行 829 C++ UnrealEditor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) 行 7192 C++ UnrealEditor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) 行 2175 C++ [内联框架] UnrealEditor-CommonUI.dll!TScriptDelegate<FNotThreadSafeNotCheckedDelegateMode>::ProcessDelegate(void *) 行 448 C++ UnrealEditor-CommonUI.dll!TMulticastScriptDelegate<FNotThreadSafeDelegateMode>::ProcessMulticastDelegate<UObject>(void * Parameters) 行 913 C++ [内联框架] UnrealEditor-CommonUI.dll!FSimpleButtonBaseGroupDelegate_DelegateWrapper(const TMulticastScriptDelegate<FNotThreadSafeDelegateMode> &) 行 71 C++ [内联框架] UnrealEditor-CommonUI.dll!FSimpleButtonBaseGroupDelegate::Broadcast(UCommonButtonBase *) 行 10 C++ UnrealEditor-CommonUI.dll!UCommonButtonGroupBase::OnSelectionStateChangedBase(UCommonButtonBase * BaseButton, bool bIsSelected) 行 335 C++ UnrealEditor-CommonUI.dll!UCommonButtonGroupBase::execOnSelectionStateChangedBase(UObject * Context, FFrame & Stack, void * const Z_Param__Result) 行 780 C++ UnrealEditor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) 行 7192 C++ UnrealEditor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) 行 2175 C++ [内联框架] UnrealEditor-CommonUI.dll!TScriptDelegate<FNotThreadSafeNotCheckedDelegateMode>::ProcessDelegate(void *) 行 448 C++ UnrealEditor-CommonUI.dll!TMulticastScriptDelegate<FNotThreadSafeDelegateMode>::ProcessMulticastDelegate<UObject>(void * Parameters) 行 913 C++ [内联框架] UnrealEditor-CommonUI.dll!FCommonSelectedStateChangedBase_DelegateWrapper(const TMulticastScriptDelegate<FNotThreadSafeDelegateMode> &) 行 1284 C++ [内联框架] UnrealEditor-CommonUI.dll!FCommonSelectedStateChangedBase::Broadcast(UCommonButtonBase *) 行 283 C++ UnrealEditor-CommonUI.dll!UCommonButtonBase::NativeOnSelected(bool bBroadcast) 行 1437 C++ UnrealEditor-CommonUI.dll!UCommonButtonBase::SetSelectedInternal(bool bInSelected, bool bAllowSound, bool bBroadcast) 行 963 C++ UnrealEditor-CommonUI.dll!UCommonButtonGroupBase::OnWidgetAdded(UWidget * NewWidget) 行 224 C++ UnrealEditor-CommonUI.dll!UCommonWidgetGroupBase::AddWidget(UWidget * InWidget) 行 17 C++ UnrealEditor-CommonUI.dll!UCommonTabListWidgetBase::RegisterTab(FName TabNameID, TSubclassOf<UCommonButtonBase> ButtonWidgetType, UWidget * ContentWidget, const int TabIndex) 行 107 C++ UnrealEditor-Force.dll!UTFTabListWidgetBase::RegisterDynamicTab(const FTFTabDescriptor & TabDescriptor) 行 77 C++ UnrealEditor-Force.dll!UTFTabListWidgetBase::execRegisterDynamicTab(UObject * Context, FFrame & Stack, void * const Z_Param__Result) 行 684 C++ UnrealEditor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) 行 7192 C++ UnrealEditor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) 行 2175 C++ UnrealEditor-UnLua.dll!FFunctionDesc::CallUE(lua_State * L, int NumParams, void * Userdata) 行 229 C++ UnrealEditor-UnLua.dll!Class_CallUFunction(lua_State * L) 行 1280 C++ [外部代码] UnrealEditor-UnLua.dll!FFunctionDesc::CallLuaInternal(lua_State * L, void * InParams, FOutParmRec * OutParams, void * RetValueAddress) 行 459 C++ UnrealEditor-UnLua.dll!FFunctionDesc::CallLua(lua_State * L, __int64 FunctionRef, __int64 SelfRef, FFrame & Stack, void * const Z_Param__Result) 行 148 C++ UnrealEditor-UnLua.dll!UnLua::FFunctionRegistry::Invoke(ULuaFunction * Function, UObject * Context, FFrame & Stack, void * const Z_Param__Result) 行 84 C++ UnrealEditor-UnLua.dll!ULuaFunction::execCallLua(UObject * Context, FFrame & Stack, void * const Z_Param__Result) 行 36 C++ UnrealEditor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) 行 7192 C++ UnrealEditor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) 行 2175 C++ [内联框架] UnrealEditor-UMG.dll!UUserWidget::Construct() 行 1052 C++ UnrealEditor-UMG.dll!UUserWidget::NativeConstruct() 行 1794 C++ UnrealEditor-CommonUI.dll!UCommonActivatableWidget::NativeConstruct() 行 34 C++ UnrealEditor-CommonUI.dll!UCommonUserWidget::OnWidgetRebuilt() 行 184 C++ UnrealEditor-UMG.dll!UWidget::TakeWidget_Private(TFunctionRef<TSharedPtr<SObjectWidget,1> __cdecl(UUserWidget *,TSharedRef<SWidget,1>)> ConstructMethod) 行 1054 C++ UnrealEditor-CommonUI.dll!UWidget::TakeDerivedWidget<SObjectWidget>(TFunctionRef<TSharedPtr<SObjectWidget,1> __cdecl(UUserWidget *,TSharedRef<SWidget,1>)> ConstructMethod) 行 828 C++ UnrealEditor-CommonUI.dll!FUserWidgetPool::AddActiveWidgetInternal<UCommonActivatableWidget>(TSubclassOf<UCommonActivatableWidget> WidgetClass, TFunctionRef<TSharedPtr<SObjectWidget,1> __cdecl(UUserWidget *,TSharedRef<SWidget,1>)> ConstructWidgetFunc) 行 146 C++ [内联框架] UnrealEditor-CommonUI.dll!FUserWidgetPool::GetOrCreateInstance(TSubclassOf<UCommonActivatableWidget>) 行 62 C++ UnrealEditor-CommonUI.dll!UCommonActivatableWidgetContainerBase::AddWidgetInternal(TSubclassOf<UCommonActivatableWidget> ActivatableWidgetClass, TFunctionRef<void __cdecl(UCommonActivatableWidget &)> InitFunc) 行 178 C++ [内联框架] UnrealEditor-Force.dll!UCommonActivatableWidgetContainerBase::AddWidget(TSubclassOf<UCommonActivatableWidget>) 行 52 C++ UnrealEditor-Force.dll!UPrimaryGameLayout::PushWidgetToLayerStack<UCommonActivatableWidget>(FGameplayTag LayerName, UClass * ActivatableWidgetClass, FName GlobalName, TFunctionRef<void __cdecl(UCommonActivatableWidget &)> InitInstanceFunc) 行 120 C++ UnrealEditor-Force.dll!UPrimaryGameLayout::PushWidgetToLayerStackAsync::__l2::<lambda_1>::operator()() 行 77 C++ [内联框架] UnrealEditor-Force.dll!Invoke(UPrimaryGameLayout::PushWidgetToLayerStackAsync::__l2::<lambda_1> &) 行 47 C++ [内联框架] UnrealEditor-Force.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(UPrimaryGameLayout::PushWidgetToLayerStackAsync::__l2::<lambda_1> &) 行 317 C++ UnrealEditor-Force.dll!TWeakBaseFunctorDelegateInstance<UPrimaryGameLayout,void __cdecl(void),FDefaultDelegateUserPolicy,`UPrimaryGameLayout::PushWidgetToLayerStackAsync<UCommonActivatableWidget>'::`2'::<lambda_1>>::ExecuteIfSafe() 行 971 C++ [内联框架] UnrealEditor-Engine.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfBound() 行 634 C++ UnrealEditor-Engine.dll!FStreamableDelegateDelayHelper::Tick(float DeltaTime) 行 179 C++ UnrealEditor-Engine.dll!FTickableGameObject::TickObjects(UWorld * World, ELevelTick LevelTickType, bool bIsPaused, float DeltaSeconds) 行 196 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) 行 2193 C++ UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) 行 550 C++ UnrealEditor.exe!FEngineLoop::Tick() 行 5869 C++ [内联框架] UnrealEditor.exe!EngineTick() 行 69 C++ UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) 行 188 C++ UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) 行 266 C++ UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) 行 317 C++ [外部代码] 最后解释一下,调用堆栈中[外部代码]和[内联框架]这两个标识代表什么意思?
最新发布
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值