使用JACOB设置XPedition带索引COM属性时遇‘Member not found’错误
问题
使用Java结合JACOB实现XPedition的COM自动化任务时,设置带负整数索引的对象属性触发如下COM异常:
com.jacob.com.ComFailException: A COM exception has been encountered: At Invoke of: Pad Description: 80020003 / Mitglied nicht gefunden.
当前处理带索引属性的Java方法:
public void setIndexedProperty(final String propertyName, final Variant[] indexes, final Variant propValue) { Variant[] parameters = new Variant[indexes.length + 1]; for (int i = 0; i < indexes.length; i++) { parameters[i] = indexes[i]; } parameters[indexes.length] = propValue; Dispatch.invokev(activeXComponent, propertyName, Dispatch.Put, parameters, new int[parameters.length]); }
调用代码:
ActiveXComponent pad = ... // 其他方法返回的有效对象 padstack.setIndexedProperty("pad", new Variant[] { new Variant(-1)}, new Variant(pad) );
用VBS脚本测试可正常设置该属性:
... set pad = padstackDBObj.NewPad() ... set padstack = padstackDBObj.NewPadstack() set padstack.pad(-1)=pad ...
已确认pad对象有效,且能成功读取padstack的pad(-1)属性,仅设置操作失败。尝试过long、short等多种参数类型,问题依旧,怀疑是负整数索引+对象类型值的组合导致。
解决方案
问题根源有两个:
- 对象属性的操作类型错误:VBS里的
set对应COM接口的PutRef操作(用于传递对象引用),原代码用Dispatch.Put仅适用于值类型,无法处理对象引用。 - 索引参数的类型兼容性:部分COM接口对参数类型要求严格,隐式创建的负整数Variant可能存在类型不匹配问题。
修改后的setIndexedProperty方法:
public void setIndexedProperty(final String propertyName, final Variant[] indexes, final Variant propValue) { Variant[] parameters = new Variant[indexes.length + 1]; System.arraycopy(indexes, 0, parameters, 0, indexes.length); parameters[indexes.length] = propValue; // 根据属性值类型选择Dispatch操作:对象类型用PutRef,值类型用Put int dispatchOp = (propValue.getvt() == Variant.VT_DISPATCH || propValue.getvt() == Variant.VT_UNKNOWN) ? Dispatch.PutRef : Dispatch.Put; Dispatch.invokev(activeXComponent, propertyName, dispatchOp, parameters, new int[parameters.length]); }
调用时可显式指定负整数的Variant类型(进一步确保兼容性):
// 显式创建VT_I4类型的负整数索引 Variant indexVariant = new Variant(); indexVariant.putInt(-1); padstack.setIndexedProperty("pad", new Variant[] {indexVariant}, new Variant(pad));
说明:
- 切换到
Dispatch.PutRef后,就能正确模拟VBS里的set操作,传递对象引用给XPedition的COM接口。 - 显式指定索引的Variant类型,避免JACOB隐式转换带来的类型不匹配问题,确保负整数索引能被COM接口正确识别。
内容的提问来源于stack exchange,提问作者ijb
相关产品推荐
相关产品推荐

