2008-09-05 46 views
5

Tôi cần gọi API Win32 để nhận chuỗi chuỗi và tôi muốn trả lại một chuỗi các chuỗi đó thành JavaScript. Đây là tập lệnh chạy trên máy cục bộ cho các tập lệnh quản trị chứ không phải cho trình duyệt web.Làm cách nào để trả về một mảng chuỗi từ đối tượng ActiveX sang JScript

tập tin IDL của tôi cho các đối tượng COM có giao diện mà tôi đang kêu gọi thành như:

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

Hàm này trả về một cách chính xác, nhưng các dây đang nhận 'mất' khi họ đang được gán cho một biến trong JavaScript.

Câu hỏi đặt ra là: Cách thích hợp để đưa mảng chuỗi trở lại biến JavaScript là gì?

Trả lời

6

Nếu tôi nhớ chính xác, bạn sẽ cần phải quấn SAFEARRAY trong một VARIANT để cho nó để có được thông qua, và sau đó sử dụng một VBArray object để giải nén nó ở phía bên JS thứ:

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

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

sau đó

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

Nên trả lại lệnh return.Detach() thực tế là > pvarBstrStringArray = ret.Detach(); Cảm ơn – Mark

1

Shog9 là đúng. Kịch bản lệnh COM yêu cầu tất cả các đầu ra đều là VARIANTS.

Thực tế, nó cũng yêu cầu tất cả các số INPUTs cũng là VARIANTS - xem chi tiết khó chịu của IDispatch trong tệp trợ giúp yêu thích của bạn. Nó chỉ nghĩ rằng sự kỳ diệu của việc thực hiện giao diện kép bởi ATL và các lớp tương tự (mà rất có thể là những gì bạn đang sử dụng) mà bạn không phải lo lắng về điều đó. Các biến VARIANT đầu vào được chuyển qua mã gọi được chuyển đổi để khớp với chữ ký phương thức của bạn trước khi phương thức thực tế của bạn được gọi.

Các vấn đề liên quan