2008-09-05 4 views
5

일련의 문자열을 가져 오기 위해 Win32 API를 호출해야하며 이러한 문자열 배열을 JavaScript로 반환하고 싶습니다. 이것은 웹 브라우저가 아닌 관리 스크립트를 위해 로컬 시스템에서 실행되는 스크립트 용입니다.ActiveX 객체에서 JScript로 문자열 배열을 반환하는 방법

 
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); 

기능이 제대로 반환하지만 그들이에 변수에 할당 될 때 문자열이 '손실'지고 :

COM 개체에 대한 나의 IDL 파일은 나뿐만로 호출하고있는 인터페이스를 가지고 JavaScript.

질문 : JavaScript 변수에 반환 된 문자열 배열을 얻는 적절한 방법은 무엇입니까?

답변

6

내가 올바르게 기억, 당신이 그것을 통과하기 위해 VARIANT에서 SAFEARRAY을 포장해야하고, 그러면 모든 일의 JS 측면에서 압축을 해제 할 VBArray object를 사용합니다 :

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray) 
{ 
    // ... 

    _variant_t ret; 
    ret.vt = VT_ARRAY|VT_VARIANT; 
    ret.parray = rgBstrStringArray; 
    *pvarBstrStringArray = ret.Detach(); 
    return S_OK; 
} 

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray(); 
+0

반환 ret.Detach() 문은 실제로 이어야합니다> pvarBstrStringArray = ret.Detach(); 감사합니다. – Mark

1

Shog9 올바른 것입니다. COM 스크립팅을 사용하려면 모든 출력이 VARIANTS 여야합니다.

실제로 모든 INPUTs도 변형이되어야합니다. 좋아하는 도움말 파일에서 IDispatch의 불쾌한 세부 사항을 확인하십시오. 그것은 단지 ATL 및 유사한 레이어 (당신이 사용하고있는 것일 가능성이 가장 높은)에 의한 듀얼 인터페이스 구현의 마술이 그 것에 대해 걱정할 필요가 없다고 생각했습니다. 실제 메서드가 호출되기 전에 호출 코드에서 전달 된 입력 된 VARIANT가 메서드 서명과 일치하도록 변환됩니다.

관련 문제