Как разрешить любым пользователям запускать программу .exe, которая считывает методы Java из своего кода С++?

Вот zip-файл исходного кода: http://cfile218.uf.daum.net/attach/254F2D4F5211EF93107910

, или видимый исходный код внизу.

Я только что скомпилировал и запустил его на своем ПК: он отлично работал как в режиме отладки, так и в режиме выпуска.

Однако, если я попытаюсь запустить его на другом ПК (на котором установлена ​​Windows XP), появится сообщение об ошибке, в котором говорится, что у меня нет «jvm.dll», поэтому он не может его запустить.

Поэтому я установил java с адреса "http://java.com/en/download/index.jsp" и запустил его. Тем не менее, он все равно сказал ту же ошибку.

Это моя проблема....

Как мне заставить его работать на других обычных ПК, на которых нет JDK или MSVC? потому что обычные пользователи определенно не владеют JDK.

## ================================ ##
// it is the c++ code that starts JVM and run java source code...

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

       #pragma comment(lib, "jvm.lib")

       using namespace std;


       void main(){

    cout<<"JVM Create Start!!"<<endl;

    // JavaVM create & JVM environment setting start
    JavaVMOption options[1];
    JavaVMInitArgs vm_args;
    JNIEnv *env;
    JavaVM *jvm;
    long status;

    options[0].optionString = "-Djava.class.path=.";
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    // JavaVM create & JVM environment setting end

    cout<<"JVM Operating......."<<endl;

    cout<<"\n10+20?\n"<<endl;

    jclass cls;
    jmethodID mid;
    jobject obj;
    int staticresult=0;
    int result=0;

    if(status != JNI_ERR)
    {
        cls = env->FindClass("FirstJavaEx");

        if(cls != 0)
        {
            //
            // Use the static method start
            //
            cout<<"\t'static'start calling method" << endl;
            mid = env->GetStaticMethodID(cls, "staticAdd", "(II)I");
            if (mid != 0)
            {
                staticresult = env->CallStaticIntMethod(cls, mid, 10, 20);
                cout<<"\t'static'result: " << staticresult << endl;
            }
            else
            {
                printf("mid error\n");
                return;
            }
            //
            // Use the static method end
            //

            //
            //Create the Instance of InvokeFirstEX Class start
            //
            cout<<"\n\tInvokeFirstEx create instance" << endl;
            jmethodID cls_constructor = env->GetMethodID(cls, "<init>", "()V");

            if (cls_constructor != 0) {             
                obj = env->NewObject(cls, cls_constructor, "()V");
                cout<<"\t\tstart calling method" << endl;
                mid = env->GetMethodID(cls, "AddFunc", "(II)I"); 
                if (mid != 0)
                {
                    result = env->CallIntMethod(obj, mid, 10, 20);
                    cout<<"\t\tresult: " << result << endl;
                }
                else
                {
                    printf("mid error\n");
                    return;
                }
            }       
        }
        else 
        {
            printf("Can't find class\n");
            return;
        }

        jvm->DestroyJavaVM();
        cout<<"\nJVM Destroyed!!"<<endl;
    }

}


## ================================ ##

person online.0227    schedule 19.08.2013    source источник
comment
Звучит как проблема с конфигурацией - вполне возможно, что программа установки не установилась для всех пользователей. Если у вас есть права администратора на машине, скорее всего, это просто случай перемещения некоторых переменных среды из настроек для каждого пользователя в системные настройки.   -  person Mats Petersson    schedule 19.08.2013
comment
возможный дубликат Не удается загрузить JVM   -  person atoMerz    schedule 19.08.2013


Ответы (2)


#pragma comment(lib, "jvm.lib")

Из-за этого ваша программа статически связана с jvm.lib. Это означает, что jvm.dll должен находиться где-то на пути поиска DLL (текущий каталог, C:\Windows\System32, %PATH%,...) при запуске вашего приложения. Вероятно, jvm.dll находится где-то на вашем %PATH%, поэтому приложение работает. Но, как вы тоже заметили, обычно это не так. Поэтому вам придется использовать другой подход: загрузить библиотеку вручную.

Я написал подробное объяснение этого в другом ответе. Это должно быть именно то, что вам нужно, вам просто нужно заменить все throw gcnew System::ComponentModel::Win32Exception своей собственной обработкой ошибок, поскольку вы не используете C++/CLI.

Изменить: вместо RegGetValue вы можете использовать RegQueryValueEx:

RegQueryValueEx(jKey, TEXT("CurrentVersion"), NULL, NULL, versionString, &bufsize);

Но если вы посмотрите на документацию этой функции, вы увидите, что вам нужно добавить нулевой терминатор:

if (bufsize <= (16 * sizeof TCHAR)) // or whatever the buffer size is
    versionString[bufsize] = TEXT('\0');
else // error: buffer overflow
person main--    schedule 19.08.2013
comment
Привет, главное - я сделал это почти сработало, но была другая ошибка, говорящая о том, что в Windows XP не удалось найти regGetValueA из ADVAPI32.dll. Я искал, что Windows XP не поддерживает метод regGetValueA. Есть ли замена этим функциям, чтобы заставить его работать на Win XP? Спасибо за помощь, ваши ответы великолепны! - person online.0227; 19.08.2013
comment
Осталась ли часть вашего вопроса без ответа или почему вы не выбрали ответ? - person main--; 23.08.2013
comment
упс я только что сделал. возможно, мне нужно выбрать ответы на все остальные вопросы прямо сейчас. - person online.0227; 23.08.2013

Как мне заставить его работать на других обычных ПК, на которых нет JDK или MSVC? потому что обычные пользователи определенно не владеют JDK.

Им не понадобится JDK, достаточно установить JRE на клиентах. Но им определенно нужны средства для доступа к jvm.dll (путем добавления его пути к переменной среды PATH, как описано здесь).

person atoMerz    schedule 19.08.2013