Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图将dll注入已经运行的JVM?_Java_C++_Winapi_Java Native Interface_Dll Injection - Fatal编程技术网

Java 试图将dll注入已经运行的JVM?

Java 试图将dll注入已经运行的JVM?,java,c++,winapi,java-native-interface,dll-injection,Java,C++,Winapi,Java Native Interface,Dll Injection,我已在HKEY_CLASSES_ROOT*中创建了一个Windows注册表项,其值为:“C:\test.exe”“%1”,以创建一个新的右键单击上下文菜单项,该项将单击文件的文件路径传递给已注册的test.exe。在test.exe中加载了一个dll文件,该文件应注入到已经运行的jvm中,以调用方法并传递文件路径。问题是,尽管.dll在while循环(原型)中运行,但它找不到JVM实例。你能帮我解决那个问题吗?我必须如何访问JVM?谢谢 .java: public class Main {

我已在HKEY_CLASSES_ROOT*中创建了一个Windows注册表项,其值为:“C:\test.exe”“%1”,以创建一个新的右键单击上下文菜单项,该项将单击文件的文件路径传递给已注册的test.exe。在test.exe中加载了一个dll文件,该文件应注入到已经运行的jvm中,以调用方法并传递文件路径。问题是,尽管.dll在while循环(原型)中运行,但它找不到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”);
如果(m_hdlinstance==0)
{
printf(“找不到jvm.dll”);
getchar();
}
其他的
printf(“找到jvm.dll”);
JavaVM*jvm;
JNIEnv*env;
typedef jint(JNICALL*GetCreatedJavaVMs)(JavaVM**,jsize,jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs=(GetCreatedJavaVMs)GetProcAddress(m_hdlinstance,“jni_GetCreatedJavaVMs”);
jint大小=1;
金特计数;
jint ret=jni_GetCreatedJavaVMs(&jvm、size和vmCount);
cout NewStringUTF(路径);
env->CallStaticVoidMethod(cls、mid、resultString);
...

您似乎不理解JVM实际上是什么。它本身就是一个加载到进程中的DLL。这不是一个“东西”,只是“在那里”。使用JNI调用API,您可以启动一个,除非您这样做,否则您将无法在刚刚启动的.exe中找到“JVM”。

与独立进程中运行的Java程序通信没有什么特别之处。可以使用Java支持的任何IPC工具。首先想到的是本地套接字,但也包括共享内存和普通的旧文件系统


JNI可能与此无关,因为Java程序处于一个单独的进程中——除非您想使用某些特定于windows的通信模式,如OLE。在这种情况下,您需要用另一种语言编写通信协议,然后将其加载到Java程序中。

Hi但在另一篇文章中,用户实现了这一点:。但我不明白他是如何做到这一点的,我希望有人能帮助我解决上面代码片段中的问题。您知道将上下文菜单的文件路径放入已经运行的JVM的另一种方法吗?我还考虑过将文件路径传递给一个Java程序,该程序使用RMI调用已经运行的Java程序的方法,但对于我的问题来说,这太复杂和“重量级”了。。。谢谢,我认为您要做的是从本机程序启动jvm和类文件。这与注入任何代码无关。您需要首先创建一个利用JNI启动JVM的C可执行文件。有很多这样的例子。请参阅:还有一件事,为什么要尝试从上下文菜单中创建文件路径!?上下文菜单是一些屏幕上的小部件,可以由任何正在运行的应用程序创建。我的意思是,您在试图错误地解决原始问题时遇到了一个问题。我的原始问题是:我有一个Java程序已经在运行(在后台)。我在windows资源管理器上下文菜单中创建了一个菜单项,在windows注册表中创建了一个条目(上面的描述)。现在,我想在已经运行的Java程序中获取单击文件的文件路径,以保存一些文件信息。我怎样才能做到这一点?我的注册表项:“C:\test.exe”“%1”或其他方法:java-jar“C:\test.jar”“%1”。。。如何将单击文件的文件路径传递给已经运行的Java prog?我需要这样的东西:()。正如我上面所描述的,问题在于我的Java程序。正在运行。如何传递文件路径?我已经考虑过第二个Java程序,它捕获文件路径并与正在运行的程序通信(关于RMI等)。但我真的不喜欢那种解决方案…没有其他意见吗?请给我一些提示,并请阅读底部我的评论。非常感谢。谢谢你的提示。我已经用套接字实现了一个原型,它可以工作:),但我希望有一个没有网络通信的低延迟版本。我用共享内存/内存映射文件做了一些尝试。但是,我如何管理进程1知道进程2已将单击的文件路径写入共享内存?我需要某种监听器(轮询/事件监听器),它告诉我何时将新数据写入共享内存…127.0.0.1上的套接字对于任何涉及UI的事情来说都足够低的延迟。
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);
...