【问题标题】:How to invoke an OleAutomation Object method for BSTR*?如何为 BSTR* 调用 OleAutomation 对象方法?
【发布时间】:2015-03-21 04:24:11
【问题描述】:

这是我从类型库中得到的 IDispatch 接口:

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 

可执行文件打开,但它没有执行我想要的操作,您可以看到它失败了,我认为它与 namergdispidNamedArgs 有关。

这是一个有效的 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" 特别感兴趣。如果你能帮忙,我会很高兴!

【问题讨论】:

    标签: java perl automation ole idispatch


    【解决方案1】:

    我认为问题出在 rgdispidNamedArgs ,在这种情况下可能不需要它,并且您将其填充为 1。我们不初始化它,所以它相当于用零填充。

    我也没有太多经验,Java 方面的经验更少。您应该检查automation.invoke 如何使用其参数构建DISPARAMS 结构。

    目前,我建议仅删除 rgdispidNamedArgs 或在不可能的情况下将其填充为零 (DISP_ID_VALUE)

    【讨论】:

    • 我已经尝试在Variant pVarResult = automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs ); 删除rgdispidNamedArgs,但没有帮助。
    【解决方案2】:

    抱歉,我对签名的关注不够。使用 BSTR * ( [in] BSTR* name ) 而不是 VT_BSTR (BSTR 上的变体) 是很不寻常的。 您是否尝试直接使用名称而不是 Variant(name)? 此外,您的 Ruby 示例中的第二个参数是 200(数字),但您使用两个字符串“Newyork”和“2000”来构建第二个和第三个参数的变体。

    【讨论】:

    • 嘿卡洛斯,我知道您正在尝试提供帮助,但您所做的只是评论而不是实际回答,并且没有在 Stackoverflow 上回复 2 个答案,您可以编辑您的第一个答案。在其他问题上的类似行为可能会让你投下很多反对票。我的第二个工作示例是 perl,我真的不明白您尝试使用 name 而不是 Variant(name) 是什么意思。
    • 好的,感谢您的提醒。我的意思是你正在使用 Variant[] rgvarg = new Variant[3];和 rgvarg[0] = new Variant(name);您以这种方式构建 Variant,但 TypeLib 说第一个是 (BSTR *) 而不是 VARIANT。
    • 好吧,那么我将省略第一个变体,但我必须以某种方式告诉编译器我想要哪个特定的“Callset”,那就是“Call_setCallDistance”,我该怎么做...
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多