Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Javascript > how to convert SafeArray to array ?

Reply
Thread Tools

how to convert SafeArray to array ?

 
 
thinktwice
Guest
Posts: n/a
 
      01-24-2006
in my script file , i need call a method of a atl com
module(implemented in vc++), which returan an safearray. i don't know
how to convert it into array in jscript. i have tried serveral ways to
get each item but failed at last. could anyone help me?

 
Reply With Quote
 
 
 
 
VK
Guest
Posts: n/a
 
      01-24-2006

thinktwice wrote:
> in my script file , i need call a method of a atl com
> module(implemented in vc++), which returan an safearray. i don't know
> how to convert it into array in jscript. i have tried serveral ways to
> get each item but failed at last. could anyone help me?


SafeArray is Microsoft specific, so you cannot handle it by JavaScript,
only by JScript (IE).

JScript has VBArray object wrapper for safe arrays.

var arr = (new VBArray(mySafeArray)).toArray();

arr now contains mySefeArray converted into standard JavaScript jagged
sparse array.

 
Reply With Quote
 
 
 
 
thinktwice
Guest
Posts: n/a
 
      01-24-2006
this is definition of the method
[ propget...]
get_mySafeArray(VARIANT *pval);

i tried
new VBArray(mySafeArray()) but failed

 
Reply With Quote
 
VK
Guest
Posts: n/a
 
      01-24-2006

thinktwice wrote:
> this is definition of the method
> [ propget...]
> get_mySafeArray(VARIANT *pval);
>
> i tried
> new VBArray(mySafeArray()) but failed


On what side (client or server) did you try? VBArray has sense only on
client side and only in the context of JScript.

Also it is IE-exclusive. Your server side should return instead
standard JavaScript array or JSON object (if AJAX) to easy handle it on
client side.

 
Reply With Quote
 
thinktwice
Guest
Posts: n/a
 
      01-24-2006
hi, VK. thanks for your reply.
i do use Jscript now.

try{
var arr = (new VBArray(myobj.mySafeArray)).toArray();
}
catch(e)
{
e.errorno;//0x800A1395
}

 
Reply With Quote
 
thinktwice
Guest
Posts: n/a
 
      01-24-2006
here is the code in server side
STDMETHOD(mySafeArray)(VARIANT *pVal)
{
CComSafeArray<long> arr;
i = 5;
while(i-- > 0)
{
hr = arr.Add(i);
}
CComVariant vtRet;
LPSAFEARRAY pCopy;
if (arr.m_psa != NULL)
{
HRESULT hRes = ::SafeArrayCopy(arr.m_psa, &pCopy);
if (SUCCEEDED(hRes) && pCopy != NULL)
{
::SafeArrayGetVartype(arr.m_psa, &(vtRet.vt));
vtRet.vt |= VT_ARRAY;
vtRet.parray = pCopy;
}
else
{
vtRet.vt = VT_ERROR;
vtRet.scode = hRes;
}
}
return vtRet.Detach(pVal);
}

 
Reply With Quote
 
VK
Guest
Posts: n/a
 
      01-24-2006

thinktwice wrote:
> here is the code in server side
> STDMETHOD(mySafeArray)(VARIANT *pVal)
> {
> CComSafeArray<long> arr;
> i = 5;
> while(i-- > 0)
> {
> hr = arr.Add(i);
> }
> CComVariant vtRet;
> LPSAFEARRAY pCopy;
> if (arr.m_psa != NULL)
> {
> HRESULT hRes = ::SafeArrayCopy(arr.m_psa, &pCopy);
> if (SUCCEEDED(hRes) && pCopy != NULL)
> {
> ::SafeArrayGetVartype(arr.m_psa, &(vtRet.vt));
> vtRet.vt |= VT_ARRAY;
> vtRet.parray = pCopy;
> }
> else
> {
> vtRet.vt = VT_ERROR;
> vtRet.scode = hRes;
> }
> }
> return vtRet.Detach(pVal);
> }


Truthfully I am not a VBArray expert as I almost never had to use it.
But in any case it's *VB*Array (Visual Basic Array)

Therefore your only options are:
1) Use VBScript on client side instead of JScript (this naturally
exclude all browsers by IE)
2) Use VBScript helper together with JScript - so safe array would come
first to VBScript which understand safe array format - and convert it
later to JavaScript array (this naturally exclude all browsers but IE)
3) Change your server-side procedure so it would return JavaScript
array. I don't see really any problems with the latter (?)

 
Reply With Quote
 
thinktwice
Guest
Posts: n/a
 
      01-24-2006
thanks VK. i just wonder why the debug window could show the array
content correctly. if it could achieve this, i guess i would get the
content out of the safearray too.
again thank you for taking time to answer my question .

 
Reply With Quote
 
VK
Guest
Posts: n/a
 
      01-24-2006

thinktwice wrote:
> i just wonder why the debug window could show the array
> content correctly.


I guess because any data type (known or unknown) is still internally a
sequence of characters / bytes. System may do not know how to handle
it, but still can display it as some text. (?)

 
Reply With Quote
 
Thomas 'PointedEars' Lahn
Guest
Posts: n/a
 
      01-24-2006
thinktwice wrote:

> i do use Jscript now.
>
> try{
> var arr = (new VBArray(myobj.mySafeArray)).toArray();
> }
> catch(e)
> {
> e.errorno;//0x800A1395
> }


There is no `errorno' property, the Error object property indicating the
numeric value associated with an error in JScript is `number'.[1] And
using it in this way does exactly nothing but evaluating the value of the
property. Furthermore, this will break in JScript/IE before version 5.

Think twice.


PointedEars
___________
[1]
<URL:http://msdn.microsoft.com/library/en-us/jscript7/html/jspronumber.asp>
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Variant, SafeArray.....etc Simply_Red C++ 2 08-01-2007 03:54 PM
Safearray question bumperdoc@gmail.com Python 0 08-18-2006 08:34 PM
Python and SAFEARRAY bumperdoc@gmail.com Python 0 08-17-2006 12:42 AM
win32com and VB COM object function with {Pointer SafeArray Pointer User Defined} Sebastian Wain Python 0 07-13-2004 08:20 PM



Advertisments