Вот интерфейс 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". Я был бы рад, если бы вы могли дать руку!
Извините, я не обратил достаточно внимания на подпись. Так необычно иметь BSTR * ([in] BSTR * name) вместо VT_BSTR (вариант в BSTR). Вы пытались использовать прямое имя вместо Variant (name)? Кроме того, второй параметр в вашем примере Ruby - 200 (число), но вы используете две строки "Newyork" и "2000" для создания вариантов во втором и третьем аргументах.
Я думаю, что проблема заключается в rgdispidNamedArgs, который может не потребоваться в этом случае, и вы заполняете его 1. Мы не инициализируем его, поэтому он будет эквивалентен заполнению нулями.
У меня тоже нет большого опыта, даже на Java. Вы должны проверить, как automation.invoke строит структуру DISPARAMS с ее аргументами.
На данный момент я предлагаю просто удалить rgdispidNamedArgs или заполнить его нулем (DISP_ID_VALUE), если это невозможно
rgdispidNamedArgs
в Variant pVarResult = automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs );
но не помогает