2015-06-10 3 views
1

У меня есть функция COM в интерфейсе disp, как показано ниже,Возвращение нескольких переменных в JavaScript из COM

[id(1)] HRESULT MultipleReturn([out]BSTR* arg1, [out, retval] BSTR* arg2); 

реализован как

STDMETHODIMP SomeCoolObject::MultipleReturn(BSTR* arg1, BSTR* arg2) 
{ 
    *arg1 = SysAllocString(L"test1"); 
    *arg2 = SysAllocString(L"test2"); 
    return S_OK; 
} 

В Python я могу назвать его как

import comtypes.client as cc 

obj = cc.CreateObject('SomeCoolObject') 
a = obj.MultipleReturn() 
print(a) # gives (u'test1', u'test2'), Python, I see you don't bite :) 

одинаковые в JavaScript

var obj = new ActiveXObject("SomeCoolObject") 

// this gives error, kind of obvious 
// 'Wrong number of arguments or invalid property assignment' 
// var val = obj.MultipleReturn(); 

var a = "holaaa!"; 
var val = obj.MultipleReturn(a); 
alert(val); // gives "test2" 
alert(a); // gives "holaaa!", may be could have given "test1" 

Это доказывает, что JavaScript не будет играть в этот мяч. Зачем? Если нет, то как вы возвращаете несколько значений из COM в JavaScript. Для этой конкретной работы я вернул JSON.

+0

Я бы подумал о SafeArray или в этом направлении. –

+0

Да. Я думал об использовании 'SAFEARRAY', но вопрос состоит в сборе двух' [out] 'переменных в JavaScript. Невозможно? – Logan

ответ

3

Сжатие JavaScript/COM не поддерживает параметры [out] - только [out, retval] (из которых, конечно, может быть только один). JavaScript, как правило, не имеет понятия pass-by-reference.

Есть несколько способов приблизиться к вашей цели.

  1. Возврат SAFEARRAY двух строк. В JavaScript потребляйте его через VBArray object.

  2. Внесите простой COM-объект с двумя объектами BSTR, создайте и верните экземпляр этого объекта через [out, retval] IDispatch**.

  3. Принять IDispatch* как параметр [in], установить новое свойство на нем через IDispatchEx::GetDispID(fdexNameEnsure). JavaScript будет потреблять его следующим образом:

.

var outParam = {}; 
var result = obj.MultipleReturn(outParam); 
var secondResult = outParam.value; 

(где value это имя свойства ваш метод создает на объекте).

+0

Это не JavaScript как таковой, это автоматизация COM (поздняя привязка, диспетчеризация, что бы она ни называла в эти дни), которая поддерживает только '[out, retval]'. – acelent

+1

@PauloMadeira Ничто в спецификации автоматизации не исключает параметры '[out]'. Они отлично работают с VB, VBA и VBScript. Так что нет, это специально JavaScript и его привязка к COM, которые имеют это ограничение. –

+0

Вы правы. Но с поздней привязкой вы должны сообщить язык таких аргументов (например, ByRef). Я почти уверен, что код Python op, as-is, может только вернуть эти значения с ранним связыванием. Таким образом, это даже не справедливое сравнение с языками VB *. – acelent

Смежные вопросы