注入后dll卸载

问题描述 投票:0回答:0

我为 Minecraft forge 1.16.5 制作了 GlowESP,但是当我尝试注入我的 dll 时出现错误。 Minecraft 挂起一会儿,调用进程 WerFault.exe(关于错误),然后我的 dll 从模块中卸载。我不知道问题出在哪里,我相信你可以帮助我。

.h 文件

#pragma once
#include <iostream>
#include <Windows.h>
#include "jni/jni.h"

JNIEnv* env = nullptr;
JavaVM* jVM = nullptr;

void Func();


.cpp file

#include "Info.h"

typedef jint(JNICALL* GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);

BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        HMODULE jvmHandle = GetModuleHandleA("jvm.dll");

        GetCreatedJavaVMs JNI_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(jvmHandle, "JNI_GetCreatedJavaVMs");

        JNI_GetCreatedJavaVMs(&jVM, 1, NULL);
        jVM->AttachCurrentThread((void**)&env, NULL);

        Func();

        return true;
    }
    return false;
}



#include "Info.h"

jclass MineClass = env->FindClass("net/minecraft/client/Minecraft");

jobject getInstance()
{
    jmethodID getInstance = env->GetStaticMethodID(MineClass, "getInstance", "()Lnet/minecraft/client/Minecraft;");
    return env->CallStaticObjectMethod(MineClass, getInstance);
}

jobject getPlayer()
{
    jfieldID playerField = env->GetFieldID(MineClass, "player", "Lnet/minecraft/client/entity/player/ClientPlayerEntity;");
    return env->GetObjectField(getInstance(), playerField);
}

void setGlow()
{
    jclass Entity = env->FindClass("net/minecraft/entity/Entity");
    jmethodID Glow = env->GetMethodID(Entity, "setGlowing", "(Z)V");
    env->CallVoidMethod(getPlayer(), Glow, true);
}

void Func()
{
    if (!getInstance())
        return;
    if (!getPlayer())
        return;

    if (GetAsyncKeyState(VK_RSHIFT))
    {
        setGlow();
    }
}

我尝试更改玩家的映射,更改项目设置,但我不知道为什么 Minecraft 挂起并卸载我的 dll。

c++ dll java-native-interface minecraft
© www.soinside.com 2019 - 2024. All rights reserved.