C 加载DLL库错误126-尝试创建JVM

C 加载DLL库错误126-尝试创建JVM,c,winapi,jvm,dll-dependency,C,Winapi,Jvm,Dll Dependency,我正在尝试生成一个.exe来运行我的Java应用程序。我有以下代码: 迷宫c #include <windows.h> #include <stdio.h> #include <jni.h> #define MAIN_CLASS "game/main/Game" __declspec(dllexport) __stdcall int run(){ JNIEnv* env; JavaVM* jvm; J

我正在尝试生成一个.exe来运行我的Java应用程序。我有以下代码:

迷宫c

#include <windows.h>
#include <stdio.h>
#include <jni.h>

#define MAIN_CLASS "game/main/Game"

__declspec(dllexport) __stdcall int run(){
    JNIEnv*         env;
    JavaVM*         jvm;
    JavaVMInitArgs  vmargs;
    JavaVMOption    options[1];
    jint            rc;
    jclass          class;
    jmethodID       mainID;

    vmargs.version = 0x00010002;
    options[0].optionString = "-Djava.class.path=.";
    vmargs.options = options;
    vmargs.nOptions = 1;
    rc = JNI_CreateJavaVM(&jvm, (void**) &env, &vmargs);
    if(rc < 0){
        printf("Failed creating JVM");
        return 1;
    }
    class = (*env)->FindClass(env, MAIN_CLASS);
    if(class == 0){
        printf("Failed finding the main class");
        return 1;
    }
    mainID = (*env)->GetStaticMethodID(env, class, "main", "([Ljava/lang/String;)V");
    if(mainID == 0){
        printf("Failed finding the main method");
        return 1;
    }
    (*env)->CallStaticVoidMethod(env, class, mainID, 0);
    (*jvm)->DestroyJavaVM(jvm);
    return 0;
}
#包括
#包括
#包括
#定义主类“游戏/主/游戏”
__declspec(dllexport)u stdcall int run(){
JNIEnv*env;
JavaVM*jvm;
JavaVMInitArgs-vmargs;
JavaVMOption选项[1];
金特钢筋混凝土;
jclass类;
jmethodidemainid;
vmargs.version=0x00010002;
选项[0]。选项字符串=“-Djava.class.path=”;
vmargs.options=选项;
vmargs.nOptions=1;
rc=JNI_CreateJavaVM(&jvm,(void**)&env和&vmargs);
if(rc<0){
printf(“创建JVM失败”);
返回1;
}
class=(*env)->FindClass(env,MAIN_类);
如果(类==0){
printf(“未能找到主类”);
返回1;
}
mainID=(*env)->GetStaticMethodID(env,类,“main”,“([Ljava/lang/String;)V”);
如果(mainID==0){
printf(“未能找到主方法”);
返回1;
}
(*env)->CallStaticVoidMethod(env,class,mainID,0);
(*jvm)->破坏JavaVM(jvm);
返回0;
}
然后将其编译为Open迷宫.dll

我有一个程序试图运行dll

开始

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>

typedef int (__stdcall* function)();

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){
    HINSTANCE hGetProcIDDLL = LoadLibrary("OpenLabyrinth.dll");
    if(!hGetProcIDDLL){
        printf("Couldn't find the library: %d", GetLastError());
        return 1;
    }
    function run = (function) GetProcAddress(hGetProcIDDLL, "run");
    if(!run){
        printf("Couldn't find the function: %d", GetLastError());
        return 1;
    }
    run();
    return 0;
}
#包括
#包括
#包括
#包括
typedef int(u stdcall*函数)();
int APICENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPTSTR lpCmdLine、int nCmdShow){
HINSTANCE hGetProcIDDLL=LoadLibrary(“open迷宫.dll”);
如果(!hGetProcIDDLL){
printf(“找不到库:%d”,GetLastError());
返回1;
}
函数run=(函数)GetProcAddress(hGetProcIDDLL,“run”);
如果(!运行){
printf(“找不到函数:%d”,GetLastError());
返回1;
}
run();
返回0;
}
后来编译成迷宫.exe

运行应用程序时,我得到LoadLibrary错误代码126。我尝试搜索错误126,发现我的.dll需要依赖项

过程监视器检查它
我发现我的程序执行的每个操作都是成功的,但返回的代码是1

然而,当我使用
Dependency Walker
检查它时,我显示了许多缺失的文件。它们要么是
API-MS-WIN-CORE-something
要么是
EXT-MS-WIN-something


错误的原因是什么?

我刚刚遇到了同样的问题。Dependency Walker没有帮助。我在Process Monitor的帮助下解决了这个问题,但我必须将它的输出与案例进行比较(在不同的机器上)DLL实际加载的位置正常。通过比较LoadImage操作,我可以看到LoadLibrary由于缺少依赖项vcruntime140.DLL而失败

但是,等等,还有更多!在我加载jvm.dll之后,我在尝试查找主类时遇到了另一个问题。同样的技术使我发现在失败的系统上缺少msvcp140.dll

我添加了vcruntime140.dll和msvcp140.dll,现在一切正常


抱歉,应该提到这是在使用OpenJDK 11.0.2。

错误代码126:“Error\u MOD\u NOT\u FOUND:找不到指定的模块。”因为只有一个<代码> LoadLibrary <代码>在您的代码中调用,我假定是这样。如果您的进程的退出代码为1,则该调用或调用<代码> GePosiald> /Code >失败。您可能需要考虑使用调试器。您缺少依赖关系。它的文档?