【发布时间】:2014-04-13 16:06:44
【问题描述】:
我在 HKEY_CLASSES_ROOT* 中创建了一个 Windows 注册表项,其值为:“C:\test.exe”“%1”,以创建一个新的右键单击上下文菜单项,将单击文件的文件路径传递给注册 test.exe。在 test.exe 中加载了一个 dll 文件,该文件应该注入到已经运行的 jvm 中以调用方法并传递文件路径。问题是 .dll 没有找到 JVM 实例,尽管它在 while 循环(原型)中运行。你能帮我解决这个问题吗?我如何访问 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);
...
【问题讨论】:
-
没有其他意见?请给我一些提示,并请阅读底部的我的 cmets。非常感谢。
标签: java c++ winapi java-native-interface dll-injection