- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我从类型库获得的 IDispatch 接口(interface):
interface IMYPhoneCmd : IDispatch {
[id(0x00000001), helpstring("method CallSet")]
HRESULT CallSet(
[in] BSTR* name,
[in, optional, defaultvalue(0)] VARIANT par1,
[in, optional, defaultvalue(0)] VARIANT par2,
[in, optional, defaultvalue(0)] VARIANT par3,
[in, optional, defaultvalue(0)] VARIANT par4,
[in, optional, defaultvalue(0)] VARIANT par5,
[in, optional, defaultvalue(0)] VARIANT par6,
[in, optional, defaultvalue(0)] VARIANT par7,
[in, optional, defaultvalue(0)] VARIANT par8,
[in, optional, defaultvalue(0)] VARIANT par9,
[in, optional, defaultvalue(0)] VARIANT par10,
[in, optional, defaultvalue(0)] VARIANT par11,
[in, optional, defaultvalue(0)] VARIANT par12,
[in, optional, defaultvalue(0)] VARIANT par13,
[in, optional, defaultvalue(0)] VARIANT par14,
[in, optional, defaultvalue(0)] VARIANT par15,
[in, optional, defaultvalue(0)] VARIANT par16,
[out, retval] long* retval);
这是我的java代码:
OleAutomation automation = new OleAutomation("PhoneScript.MYPhoneCmd");
int[] ids = automation.getIDsOfNames(new String[] { "CallSet", "name" });
int dispIdMember = ids[0];
int[] rgdispidNamedArgs = new int[] {ids[1]};
Variant[] rgvarg = new Variant[3];
String name = "Call_setCallDistance";
rgvarg[0] = new Variant(name);
rgvarg[1] = new Variant("Newyork");
rgvarg[2] = new Variant("2000");
System.out.println(dispIdMember);
// Call the method
Variant pVarResult = automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs );
// Check the return value
if (pVarResult == null ){
System.out.println("Failed to call method ");
}
输出是:
1
Failed to call method
可执行文件打开,但它没有执行我想要的操作,正如您所看到的,它失败了,我认为它与 name
和 rgdispidNamedArgs
有关。
这是一个有效的 Perl 等效项:
my $Callset = "Call_setCallDistance"; # Callset name
my $param1 = Newyork; # Callset parameter 1
my $param2 = 2000; # Callset parameter 2
Win32::OLE::CreateObject('PhoneScript.MYPhoneCmd', $PhoneClient) || die "can't connnect to PhoneClient: $!\n";
$Result = $PhoneClient->CallSet($Callset, $param1, $param2); # This is the exact line I need in java
我第一次在java中使用OleAutomation,对它没有太多经验,也可以在互联网上找到很少的示例,我尝试转换为我的项目找到的示例,但该示例是BSTR而不是BSTR*,在我看来,这是唯一的区别,它不起作用,我不知道为什么。 CallSet 方法用于各种设置/调用,例如 20-30,但我对“Call_setCallDistance”特别感兴趣。如果您能伸出援手,我将非常高兴!
最佳答案
我认为问题是 rgdispidNamedArgs ,在这种情况下可能不需要它,并且您将其填充为 1´s。我们不初始化它,所以它相当于用零填充。
我也没有太多经验,更不用说Java了。您应该检查automation.invoke如何使用其参数构建DISPARAMS结构。
目前,我建议仅删除 rgdispidNamedArgs 或将其填充为零(DISP_ID_VALUE)(如果不可能的话)
关于java - 如何调用 BSTR* 的 OleAutomation 对象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087734/
我的公司有大量用于生成客户信函的模板可供选择。我需要修改现有流程,以便保存生成的文件(模板+数据)的副本以供以后编辑。 我的问题是,当我打开其中一个已保存的 MSWord 文档、编辑然后关闭时,MSW
我正在使用 OpenOffice Writer,我希望在程序控制下进行打印。但是,我不希望打印到默认打印机,而是根据我生成的文档类型将某些文档定向到某些打印机。 使用Bernard Marcelly'
我正在像这样创建 IDispatch: IDispatch *m_pWApp = NULL; CoInitialize(NULL); CLSID clsid; m_hr = CLSIDFromProg
我意外地收到了来自有效对象的错误 424。 我有许多使用 ATL 用 C++ 编写的 OleAutomation 类。 我可以使用早期或晚期绑定(bind)来实例化它们。我可以调用它们的方法和属性并获
这是我从类型库获得的 IDispatch 接口(interface): interface IMYPhoneCmd : IDispatch { [id(0x00000001), helpstr
我已经成功地使用 Java 和 SWT 编写了 Microsoft Word 的自动化程序。现在我需要为 Open Office/Libre Office writer 做同样的事情。 对于 MS W
我是一名优秀的程序员,十分优秀!