Как вызвать метод объекта OleAutomation для BSTR *?

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

Я работаю в первый раз с OleAutomation в java и не имею большого опыта работы с ним, также могу найти очень мало примеров в Интернете, и я попытался преобразовать пример, который я нашел для своего проекта, но пример был с BSTR, а не с BSTR *, мне кажется, что это единственная разница, и она не работает, я не знаю почему. Метод CallSet используется для различных настроек/вызовов вроде 20-30, но Im специально интересуется "Call_setCallDistance". Я был бы рад, если бы вы могли дать руку!

Теги:
automation
ole
idispatch

2 ответа

0

Извините, я не обратил достаточно внимания на подпись. Так необычно иметь BSTR * ([in] BSTR * name) вместо VT_BSTR (вариант в BSTR). Вы пытались использовать прямое имя вместо Variant (name)? Кроме того, второй параметр в вашем примере Ruby - 200 (число), но вы используете две строки "Newyork" и "2000" для создания вариантов во втором и третьем аргументах.

  • 0
    Привет, Карлос. Я знаю, что вы пытаетесь помочь, но вы просто комментируете, а не отвечаете, и никто не отвечает на 2 ответа на Stackoverflow, вы можете просто отредактировать свой первый ответ. Подобное поведение по другим вопросам, может дать вам много голосов вниз. Мой второй рабочий пример - Perl, и я не совсем понимаю, что вы имеете в виду, когда используете имя вместо Variant (имя).
  • 0
    Хорошо, спасибо за заголовок. Я имел в виду, что вы используете Variant [] rgvarg = new Variant [3]; и rgvarg [0] = новый вариант (имя); Вы строите Variant таким образом, но TypeLib говорит, что первым является (BSTR *), а не VARIANT.
Показать ещё 1 комментарий
0

Я думаю, что проблема заключается в rgdispidNamedArgs, который может не потребоваться в этом случае, и вы заполняете его 1. Мы не инициализируем его, поэтому он будет эквивалентен заполнению нулями.

У меня тоже нет большого опыта, даже на Java. Вы должны проверить, как automation.invoke строит структуру DISPARAMS с ее аргументами.

На данный момент я предлагаю просто удалить rgdispidNamedArgs или заполнить его нулем (DISP_ID_VALUE), если это невозможно

  • 0
    Я уже пытался удалить rgdispidNamedArgs в Variant pVarResult = automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs ); но не помогает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню