خطأ في تشغيل تطبيق Java من تطبيق Win32 C ++ باستخدام CreateProcess
-
22-09-2019 - |
سؤال
أحاول تشغيل تطبيق Java من تطبيق C ++ باستخدام الكود التالي:
#include <windows.h>
#include <memory.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
if (CreateProcess(TEXT("c:\\java\\jre\\bin\\java.exe"), TEXT("-jar testapp.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return 0;
}
عندما أقوم بإنشاء وتشغيل البرنامج ، أحصل على الخطأ التالي:
Exception in thread "main" java.lang.NoClassDefFoundError: testapp/jar
Caused by: java.lang.ClassNotFoundException: testapp.jar
at: java.net.URLClassLoader$1.run(Uknown Source)
at: java.security.AccessController.doPrivileged(Native Method)
at: java.net.URLClassLoader.findClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
at: sun.misc.Launcher$AppClassLoader.loadClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
Could not find the main class: testapp.jar. Program will exit.
ال testapp.jar
الملف عبارة عن ملف جرة يمكن تصديره من مشروع Eclipse مع فئة واحدة فيه:
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
يوجد ملف EXE و JAR في نفس المجلد بالضبط ، وأنا أقوم بتشغيل EXE من سطر الأوامر. إذا قمت بتشغيل الجرة مباشرة عن طريق وضع c:\java\jre\bin\java.exe -jar testapp.jar
في قيادة القيادة ، كل شيء يعمل كما هو متوقع.
هل لدى أي شخص أي فكرة عما يحدث هنا؟
تحرير: شكرًا لكم جميعًا على مساعدتكم ، لكن يبدو أنني عملت الآن.
المحلول
حلها. انا إستعملت:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT(" -jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
بينما استخدمت:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT("-jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
الذي ، عندما استخدمته ، يكرر خطأك. الفرق هو مساحة تسبق -jar
التبديل ولماذا يجب أن يكون ، لا أعرف ، لقد تعثرت عليه خطأ!
نصائح أخرى
اضطررت فقط إلى تغيير الطريقة التي كنت أتصل بها CreateProcess:
wchar_t *command = (wchar_t*)calloc(512, sizeof(wchar_t));
wsprintf(command, TEXT("c:\\java\\jre\\bin\\java.exe -jar testapp.jar"));
if (CreateProcess(NULL, command, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
الوثائق ل CreateProcess()
يحدد المعلمة lpCurrentDirectory
:
المسار الكامل للدليل الحالي لهذه العملية. يمكن للسلسلة أيضًا تحديد مسار UNC.
إذا كانت هذه المعلمة فارغة ، فستكون للعملية الجديدة نفس محرك الأقراص والدليل الحاليين مثل عملية الاتصال.
أنت مقتطف تفتقد تعريفا ل path
, ، ولكن على الأرجح يتم إعدادها بشكل غير صحيح.
حاول تحديد دليل الجرة بعد -jar
. قد يكون له علاقة مع دليل العمل الحالي الخاص بك ...