Java 如何为BSTR*调用OleAutomation对象方法?

Java 如何为BSTR*调用OleAutomation对象方法?,java,perl,automation,ole,idispatch,Java,Perl,Automation,Ole,Idispatch,以下是我从类型库获得的IDispatch接口: interface IMYPhoneCmd : IDispatch { [id(0x00000001), helpstring("method CallSet")] HRESULT CallSet( [in] BSTR* name, [in, optional, defaultvalue(0)] VARIANT par1,

以下是我从类型库获得的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 
可执行文件打开了,但它没有执行我想要的操作,正如您看到的那样,它失败了,我假设它与
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\u setCallDistance”。如果你能帮我一把,我会很高兴的

我认为问题是rgdispidNamedArgs,在本例中可能不需要它,您已经用1填充了它。我们不初始化它,所以它相当于用零填充它

我也没有太多的经验,更不用说Java了。您应该检查automation.invoke如何使用其参数构建异构结构


现在,我建议删除rgdispiddnamedargs,或者用零(DISP_ID_值)填充它,如果不可能的话

对不起,我没有对签名给予足够的注意。用BSTR*([in]BSTR*名称)代替VT_BSTR(BSTR上的变体)是非常罕见的。 您是否尝试直接使用名称而不是变体(名称)?
此外,Ruby示例中的第二个参数是200(数字),但您使用两个字符串“Newyork”和“2000”来构建第二个和第三个参数中的变量。

我已经尝试在
Variant pVarResult=automation.invoke(dispIdMember,rgvarg,rgdispidNamedArgs)中删除
rgdispidNamedArgs
但没有帮助。嘿,卡洛斯,我知道你在试图帮助,但你所做的只是评论,而不是实际回答,一个没有回答Stackoverflow上的2个答案,你可以编辑你的第一个答案。在其他问题上的类似行为,可能会让你投下很多反对票。我的第二个工作示例是perl,我真的不理解您尝试使用name而不是Variant(name)的意思。我的意思是,您正在使用Variant[]rgvarg=newvariant[3];和rgvarg[0]=新变量(名称);你用这种方式构建了一个变量,但是TypeLib说第一个是(BSTR*),而不是一个变量。好吧,那么我将省略第一个变量,但我必须告诉编译器我想要哪个特定的“调用集”,即“Call_setCallDistance”,我该如何。。。