vb.net生成java可调用的dll
客户提供了一个ocx,用来操作硬件,但是系统是用java写的,所以一开始的思路就是java调用ocx,但是出现了问题(http://bbs.csdn.net/topics...
客户提供了一个ocx,用来操作硬件,但是系统是用java写的,所以一开始的思路就是java调用ocx,但是出现了问题(http://bbs.csdn.net/topics/390411428?page=1帖子中8楼出现的问题)
3.
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: LoadFile
Description: 灾难性故障
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.com.Dispatch.call(Dispatch.java:544)
at com.lv.office.AIPToTest.jacob(AIPToTest.java:24)
at com.lv.office.AIPToTest.main(AIPToTest.java:14)
原因是:
在OCX控件中,重写COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一个方法
BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)
{
return TRUE;
}
用这个方法的理由是:
这个错误是由ActiveX结构设计造成的。
在Ole4.0版本之前,外部程序是可以直接调用OCX中方法的。Ole4.0之后,每次调用控件中的方法,系统会自动检查是否允许调用,即运行COleControl.IsInvokeAllowed (DISPID)
该方法检查控件是否正确的初始化或者是否通过持久存储接口正确加载,如果两个条件有一个满足,即返回TRUE,否则返回FALSE。
当控件在MFC中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会遇到这个问题。但是,当我们从C、C++的dll中调用控件时,不满足上述条件,该方法返回FALSE,这时候再调用任何控件方法,都会出现上述异常。
上面给了解决办法,需要改动ocx源代码,加一个方法,可是这个ocx是客户提供的,我们没办法改。于是有了另外一个思路,用.net调用这个ocx,然后java通过jnative调用.net生成的dll,但是.net生成的dll跟vb生成的不一样,直接调用不了,查了好多资料,写的都不清不楚的。因为对.net不是很熟,求大牛给出详细步奏,回来的满意的话,剩下的分都加给你。 展开
3.
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: LoadFile
Description: 灾难性故障
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.com.Dispatch.call(Dispatch.java:544)
at com.lv.office.AIPToTest.jacob(AIPToTest.java:24)
at com.lv.office.AIPToTest.main(AIPToTest.java:14)
原因是:
在OCX控件中,重写COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一个方法
BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)
{
return TRUE;
}
用这个方法的理由是:
这个错误是由ActiveX结构设计造成的。
在Ole4.0版本之前,外部程序是可以直接调用OCX中方法的。Ole4.0之后,每次调用控件中的方法,系统会自动检查是否允许调用,即运行COleControl.IsInvokeAllowed (DISPID)
该方法检查控件是否正确的初始化或者是否通过持久存储接口正确加载,如果两个条件有一个满足,即返回TRUE,否则返回FALSE。
当控件在MFC中使用时,很多细节,如初始化,都被过滤了,这样,大多数用户都不会遇到这个问题。但是,当我们从C、C++的dll中调用控件时,不满足上述条件,该方法返回FALSE,这时候再调用任何控件方法,都会出现上述异常。
上面给了解决办法,需要改动ocx源代码,加一个方法,可是这个ocx是客户提供的,我们没办法改。于是有了另外一个思路,用.net调用这个ocx,然后java通过jnative调用.net生成的dll,但是.net生成的dll跟vb生成的不一样,直接调用不了,查了好多资料,写的都不清不楚的。因为对.net不是很熟,求大牛给出详细步奏,回来的满意的话,剩下的分都加给你。 展开
若以下回答无法解决问题,邀请你更新回答
展开全部
ocx有没有加壳?
要不要我试试看能不能破解这个ocx,把COleControl.IsInvokeAllowed给重写了……
不一定确保成功。
如果想试试看的话把这个ocx给我。
不过要我能用C++正确加载的……(就是说别缺什么文件
我跟踪一下看看有没有办法。
不行的话给你外挂一个dll把这个函数hack进去
要不要我试试看能不能破解这个ocx,把COleControl.IsInvokeAllowed给重写了……
不一定确保成功。
如果想试试看的话把这个ocx给我。
不过要我能用C++正确加载的……(就是说别缺什么文件
我跟踪一下看看有没有办法。
不行的话给你外挂一个dll把这个函数hack进去
更多追问追答
追问
我直接用vb.net写个界面把它拖进来是可以使用的,硬件动作正常。但是实际上客户到底有多少周边设备是不知道,也就是有多少ocx也不知道,不可能每添加一个设备加破解一次ocx的。现在的思路就是把买个新ocx里面的方法明,参数个数和类型存数据库,即便新添加设备,也就是再数据库里填一组数据,然后通过java取出数据,拼成一段script,其他的都通过这个dll统一去执行这段script并返回结果。
我直接用vb.net写个界面把它拖进来是可以使用的,硬件动作正常。但是实际上客户到底有多少周边设备是不知道,也就是有多少ocx也不知道,不可能每添加一个设备加破解一次ocx的。现在的思路就是把买个新ocx里面的方法明,参数个数和类型存数据库,即便新添加设备,也就是再数据库里填一组数据,然后通过java取出数据,拼成一段script,其他的都通过这个dll统一去执行这段script并返回结果。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询