我在HKEY_CLASSES_ROOT *中创建了一个Windows注册表项,其值为:“C:\ test.exe”“%1”,以创建一个新的右键单击上下文菜单项,将所单击文件的文件路径传递给注册test.exe。在test.exe中加载了一个dll文件,该文件应注入已经运行的jvm以调用方法并传递文件路径。问题是.dll虽然在while循环(prototype)中运行,却找不到JVM实例。你能帮我解决一下这个问题吗?我如何访问JVM?感谢
的.java:
public class Main
{
public static void main(String[] args)
{
while(true)
{
}
}
public static void readAndOutputFilePath(String result)
{
System.out.println("Java result: "+result);
try
{
System.in.read();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
的.dll:
HMODULE m_hDllInstance = LoadLibrary("jvm.dll");
if( m_hDllInstance == 0)
{
printf("The jvm.dll could not be found");
getchar();
}
else
printf("jvm.dll found");
JavaVM *jvm;
JNIEnv *env;
typedef jint (JNICALL * GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(m_hDllInstance, "JNI_GetCreatedJavaVMs");
jint size = 1;
jint vmCount;
jint ret= jni_GetCreatedJavaVMs(&jvm, size, &vmCount);
cout << endl << "GetCreated: " << vmCount << endl;
getchar();
jint rc = jvm->AttachCurrentThread((void **) & env, NULL);
jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "readAndOutputFilePath", "(Ljava/lang/String;)V");
jstring resultString = env->NewStringUTF(path);
env->CallStaticVoidMethod(cls, mid, resultString);
...
答案 0 :(得分:1)
与独立,独立进程中运行的Java程序进行通信没有什么特别之处。可以使用Java支持的任何IPC工具。本地套接字是第一个想到的东西,但也是共享内存和普通的旧文件系统。
JNI可能无关紧要,因为您的Java程序是在一个单独的进程中 - 除非您想使用某些特定于Windows的通信模式,例如OLE。在这种情况下,您需要用另一种语言编写通信协议,并将它们加载到Java程序中。
答案 1 :(得分:0)
您似乎并不了解JVM究竟是什么。它本身就是一个加载到进程中的DLL。这不仅仅是“在那里”的“事物”。使用JNI调用API,您可以启动它,除非您这样做,否则您不会在自己刚刚开始的.exe中找到'the'JVM。