Привет, у меня есть DLL, и я регистрирую native-функцию, где будет два параметра. Часть с регистрацией моей native-функции работает правильно.
Но я не знаю, как использовать эту функцию, как вызвать её в моём файле UC, например, где я объявляю:
native(4004) final static function bool RequestAutoSoulShot( int shotid, bool _type );
Например, я попытался объявить её в NWindow/Classes/UIScript.UC и использовать в классе, который находится в Interface/Classes/AutoShotWnd.UC.
Но я не могу скомпилировать, у меня возникает ошибка при вызове функции:
AutoShotItemWnd.uc(35) : Error, 'RequestAutoSoulShot': Bad command or expression
Compile aborted due to errors.
Я попытался вызвать её напрямую в моём скрипте: AutoShotItemWnd.uc.
AutoShotItemWnd.uc
Но я получил ошибку. Моя функция действительно была вызвана, но с ошибкой, и она была вызвана ещё до входа в игру. Кто-нибудь может мне помочь? Где мне объявить мою native-функцию в UC и как её вызывать?
Код:
#include "pch.h"
#include <string>
#include <sstream>
class UObject {};
struct FFrame
{
public:
int* ftable;
void* Node;
UObject* Object;
BYTE* Code;
BYTE* Locals;
INT LineNum;
inline INT ReadInt() {
INT Result;
Result = *(INT*)Code;
Code += sizeof(INT);
Code++;
return Result;
}
inline void SkipByte(){
++Code;
}
inline void SkipBytes(const INT Count){
Code += Count;
}
inline BYTE ReadByte(){
return *Code++;
}
};
#define RESULT_DECL void*const Result
typedef void (*Native)(struct FFrame& TheStack, RESULT_DECL);
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
GRegisterNative_fnType volatile GRegisterNative_fn = NULL;
void RequestAutoSoulShot(struct FFrame& Stack, RESULT_DECL)
{
Stack.Code++;
int param1 = Stack.ReadInt();
int param2 = Stack.ReadByte();
std::stringstream ss;
ss << "param1: " << param1 << ", param2: " << param2;
std::wstring message = std::wstring(ss.str().begin(), ss.str().end());
MessageBox(nullptr, message.c_str(), L"hook", MB_OK);
}
// Точка входа DLL
extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call != DLL_PROCESS_ATTACH) {
return TRUE;
}
auto hCore = GetModuleHandleA("Core.dll");
if (!hCore) {
MessageBoxW(NULL, L"FailedToGetHCore", L"hook", MB_OK);
return true;
}
GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");
if (!GRegisterNative_fn) {
MessageBox(nullptr, L"Nullable GRegisterNative_fn", L"hook", MB_OK);
return true;
}
GRegisterNative_fn(4004, &RequestAutoSoulShot);
return TRUE;
}
Но я не знаю, как использовать эту функцию, как вызвать её в моём файле UC, например, где я объявляю:
native(4004) final static function bool RequestAutoSoulShot( int shotid, bool _type );
Например, я попытался объявить её в NWindow/Classes/UIScript.UC и использовать в классе, который находится в Interface/Classes/AutoShotWnd.UC.
C++:
class AutoShotItemWnd extends UICommonAPI;
var WindowHandle zzMe;
var ItemWindowHandle zzinventory_item;
var ItemWindowHandle rhand;
var ItemInfo zziteminfoka;
var int _type;
var int _activateShotType;
var int _shotID;
var int zzkiaka2a;
var bool zzasnewk;
var ShortcutWnd zzshortcut;
function registerload()
{
RegisterEvent(150);
RegisterEvent(40);
RegisterEvent(2610);
RegisterEvent(693);
RegisterEvent(44467);
return;
}
function sendRequestToServer(optional int shotID, optional int _type)
{
local string zParam;
// End:0x21
if( shotID > 10000 )
{
shotID = shotID - 10000;
}
RequestAutoSoulShot(shotID, True);
//RequestBypassToServer((("RequestAutoShot: ShotID="$string(shotID))$" bEnable=")$string(_type));
ParamAdd(zParam, "ShotID", string(shotID));
ParamAdd(zParam, "bEnable", string(_type));
if( _type == 1 )
{
ActivateAnimation(zParam);
}
return;
}
function OnLoad()
{ handleEquipRHandItem();
registerload();
inithandle();
sendRequestToServer();
return;
}
Но я не могу скомпилировать, у меня возникает ошибка при вызове функции:
AutoShotItemWnd.uc(35) : Error, 'RequestAutoSoulShot': Bad command or expression
Compile aborted due to errors.
Я попытался вызвать её напрямую в моём скрипте: AutoShotItemWnd.uc.
AutoShotItemWnd.uc
C++:
native(4004) final static function bool RequestAutoSoulShot( int shotid, bool _type );
function registerload()
{
RegisterEvent(150);
RegisterEvent(40);
RegisterEvent(2610);
RegisterEvent(693);
RegisterEvent(44467);
return;
}
function sendRequestToServer(optional int shotID, optional int _type)
{
local string zParam;
// End:0x21
if( shotID > 10000 )
{
shotID = shotID - 10000;
}
RequestAutoSoulShot(shotID, True);
//RequestBypassToServer((("RequestAutoShot: ShotID="$string(shotID))$" bEnable=")$string(_type));
ParamAdd(zParam, "ShotID", string(shotID));
ParamAdd(zParam, "bEnable", string(_type));
if( _type == 1 )
{
ActivateAnimation(zParam);
}
return;
}
Но я получил ошибку. Моя функция действительно была вызвана, но с ошибкой, и она была вызвана ещё до входа в игру. Кто-нибудь может мне помочь? Где мне объявить мою native-функцию в UC и как её вызывать?