1

タイプ ライブラリから取得した 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を使用していますが、インターネット上でその例を見つけることはほとんどありませでした.これが唯一の違いのようで、うまくいきません。理由はわかりません。CallSet メソッドは、20-30 などのさまざまな設定/呼び出しに使用されますが、特に"Call_setCallDistance"に関心があります。お手にとって頂けたら嬉しいです!

4

2 に答える 2

0

すみません、署名に十分な注意を払っていませんでした。VT_BSTR (BSTR のバリアント) の代わりに BSTR * ( [in] BSTR* name ) を持つことは非常に珍しいことです。Variant(name) の代わりに直接 name を使用してみましたか? また、Ruby の例の 2 番目のパラメーターは 200 (数字) ですが、「Newyork」と「2000」の 2 つの文字列を使用して、2 番目と 3 番目の引数でバリアントを構築します。

于 2015-01-23T12:20:55.633 に答える
0

問題は rgdispidNamedArgs であると思いますが、この場合は必要ない可能性があり、1 で満たされています。初期化しないので、ゼロで埋めたのと同じです。

私もあまり経験がありません。Java の経験はさらに少ないです。自動化.invoke が引数を使用して DISPARAMS 構造を構築する方法を確認する必要があります。

今のところ、rgdispidNamedArgs を削除するか、それが不可能な場合はゼロ (DISP_ID_VALUE) で埋めることをお勧めします。

于 2015-01-22T17:11:11.927 に答える