Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
Object JNI:接收器对象未触发,释放冻结_Object_Com_Java Native Interface - Fatal编程技术网

Object JNI:接收器对象未触发,释放冻结

Object JNI:接收器对象未触发,释放冻结,object,com,java-native-interface,Object,Com,Java Native Interface,我试图通过它提供的COM对象为这个windows应用程序创建一个名为“Personal Communications”的JNI包装器 通过大量的谷歌搜索,我自己管理了很多。我可以成功地连接到COM对象并运行getter/setter方法来检索应用程序中的各种信息 我现在的问题是Sink对象(试图让应用程序向我发送事件)。 据我所知,一切都返回了一个良好的返回代码,但从未调用Sink类上的调用。更糟糕的是,如果假设调用了一个事件,则释放告诉它开始发送事件的COM对象会挂起应用程序。如果我结束应用程

我试图通过它提供的COM对象为这个windows应用程序创建一个名为“Personal Communications”的JNI包装器

通过大量的谷歌搜索,我自己管理了很多。我可以成功地连接到COM对象并运行getter/setter方法来检索应用程序中的各种信息

我现在的问题是Sink对象(试图让应用程序向我发送事件)。 据我所知,一切都返回了一个良好的返回代码,但从未调用Sink类上的调用。更糟糕的是,如果假设调用了一个事件,则释放告诉它开始发送事件的COM对象会挂起应用程序。如果我结束应用程序,通知它接收器,但不让它触发任何事件,则应用程序不会挂起

我尝试过各种方法和编译器。它们都给出相同的结果。但奇怪的是,如果我在Java之外的实际应用程序(exe)中使用相同的代码,那么一切都可以正常工作,事件通过Sink对象触发。因此,我真的不知道图片中的Java有什么问题

以下是我迄今为止的代码:

PcommControl.h(我的用于控制COM的包装器)

InitConnectionManagerRevents:创建一个新的接收器对象,并将其通知COM。RegisterStartEvent通知COM开始向接收器对象发送消息

removeConnectionManagerEvents:取消建议并删除所有接收器对象。UnregisterStartEvent告诉COM停止向接收器对象发送消息

jobject PcommControl::initconnectionmanagervents(jobject类型){
如果(!initConnectionManager())
返回NULL;
if(autConnectionManagerPoint==NULL){
autConnectionManagerPoint=getConnectionPoint(autConnectionManager,
DIID_IStartEvent);
if(autConnectionManagerPoint==NULL)
返回NULL;
}
ConnectionSink*conSinkC=新的ConnectionSink(jvm,sinkType);
如果(!conSinkC->isInitialized()){
删除conSinkC;
返回NULL;
}
如果(!conSinkC->advice(autConnectionManagerPoint)){
#ifdef调试
printf(“PcommControl:未能通知ConnectionManagerEvent\n”);
#恩迪夫
删除conSinkC;
返回NULL;
}
#ifdef调试
printf(“PcommControl:ConnectionManagerEvent>%ld\n”,conSinkC->getCookie());
#恩迪夫
ConnectionSink*temp=connectionmanagervents.put(
(long)conSinkC->getCookie(),conSinkC);
如果(临时){
临时->释放();
}
if(ConnectionManagerRevents.getSize()==1){
#ifdef调试
printf(“PcommControl:registingconnectionmanagervent\n”);
#恩迪夫
HRESULT HRESULT=autConnectionManager->RegisterStartEvent();
如果(!成功(hresult)){
#ifdef调试
printf(“未能获取RegisterStartEvent\n”);
#恩迪夫
//待办事项
}
}
返回conSinkC->getJavaObjectConnection();
}
void PcommControl::removeConnectionManagerEvents(){
连接链接*连接链接;
如果((自动连接管理器)和(!安全卸载)){
#ifdef调试
printf(“PcommControl:unregistingconnectionmanagervent\n”);
#恩迪夫
//TODO:似乎会给Java带来悬而未决的问题
HRESULT HRESULT=autConnectionManager->UnregisterStartEvent();
如果(!成功(hresult)){
#ifdef调试
printf(“未能注销StartEvent\n”);
#恩迪夫
}
}
而((ConnectionLink=connectionManagerEvents.removeHead())!=NULL){
如果(!safeUnload){
#ifdef调试
printf(“PcommControl:释放连接管理器事件\n”);
#恩迪夫
连接链接->未建议();
#ifdef调试
printf(“PcommControl:start release\n”);
#恩迪夫
连接链接->释放();
}
}
#ifdef调试
printf(“PcommControl:done释放ConnectionManager事件\n”);
#恩迪夫
}
h(所有JNI接收器的我的接收器接口)

\ifndef JNIEVENTSINK\H_
#定义JNIEVENTSINK_H_
#包括
#包括
#定义FAR*FAR*
JNIEventSink类:公共IDispatch{
受保护的:
私人:
布尔初始化;
布尔解构器;
德沃德参考计数;
JavaVM*jvm;
jobject-javaObjectConnection;
德沃德·库奇;
i连接点*点;
静态jclass-javaLangClass;
静态jMethodIdJavaLangClassNewInstance;
void init(JavaVM*JavaVM,作业对象类型){
初始化=假;
解构器=假;
参考计数=0;
jvm=javaVM;
javaObjectConnection=NULL;
cookie=0;
AddRef();
//从sinkType创建Java接收器类
//if(javaVM){
//JNIEnv*env;
//javaVM->AttachCurrentThread((void**)和env,NULL);
//if(env==NULL){
//#ifdef调试
//printf(“JNIEventSink:java环境未找到!\n”);
//#恩迪夫
//返回;
//          }
//
//if(javaLangClass==NULL){
//javaLangClass=NULL;
//javaLangClassNewInstance=NULL;
//
//javaLangClass=env->FindClass(“java/lang/Class”);
//if(javaLangClass==NULL){
//#ifdef调试
//printf(“未找到JNIEventSink:javaLangClass!\n”);
//#恩迪夫
//返回;
//              }
//javaLangClassNewInstance=env->GetMethodID(javaLangClass,
//“newInstance”,“()Ljava/lang/Object;”;
//if(javaLangClassNewInstance==NULL){
//#ifdef调试
//printf(
//“JNIEventSink:javaLangClass新实例未找到!\n”);
//#恩迪夫
//返回;
//              }
//          }
//
//javaObjectConnection=env->CallObjectMethod(sinkType,
//javaLangClassNewInstance);
//if(javaObjectConnection==NULL){
//#ifdef调试
//printf(
//“JNIEventSink:无法创建新连接
Java_gov_ssa_utils_pcomm_ConnectionManager_registerStartEvents
JNIEventSink: constructor
JNIEventSink: Add Ref 72880304,0,0
JNIEventSink: Start Advise
JNIEventSink: Add Ref 72880304,0,1
JNIEventSink: Advise End
PcommControl: ConnectionManagerEvent> 1
PcommControl: Registering ConnectionManagerEvent
Created and attached sink.
Waiting 10 seconds for user to fire event
Destroying.
Java_gov_ssa_utils_PComm_release
PcommControl: destroying
PcommControl: Unregistering ConnectionManagerEvent