views:

413

answers:

4

I have a ActiveX object witch I want to use in the browser (javascript).
There is a function I want to call. It's prototype is:

function TOPOSFiscalPrinter.DirectIO(Command: Integer; var pData: Integer;
  var pString: WideString): Integer;

So, the function returns three values: result code, pData and pString;
In javascript the function does not update the variables pData and pString;

function test()
{
  var d=1, s="DIRECIO:";
  var code = opos.DirectIO(1024, d, s);

  alert(d); alert(s);
}

Variables d and s are not updated. They must be d=0 and s="ED123456";
How to read data from function witch returns more than one value in javascript?

EDIT
Apparently, Javascript always passes parameters by value, never by reference.
Is there anything I can do to pass values by reference in Javascript, or I will have to change my design to only rely on parameters passed by value and on return values.

+1  A: 

Primitive types, primarily strings/numbers/booleans are passed by value for efficiency purposes. Objects such as functions, objects, arrays and the like are passed by reference. You can create an object and pass it, eg { d:1, s:'directo' } and then change the values because you're passing a reference.

meder
It doesn't work either. d=new Object(1); s=new Object('DIRECTIO:');
st.stoqnov
Please paste *full* code of what you're doing.
meder
By the way, I don't mean create a new Object for each variable, I mean make an object literal such as `var obj = { d: 'string', l: 'otherthing' }` and pass `obj`...
meder
function test(){ var d = new Object(1); var s = new Object('DIRECTIO:'); opos.DirectIO(1024, d, s); // this is my activex func alert(d); alert(s);}After call d=1; s='DIRECTIO:'; No change.d should be d=0;s should be s='ED123456';I also tryedvar d = new Object();d.value = 1;var s = new Objevt();s = 'DIRECTIO:';But no luck eighter.
st.stoqnov
A: 

There is no support for output parameter in JavaScript. Pack what you want to return in an automation object, assign values to its properties and return it, or if your return value is already occupied, create a class that has properties you can assign to in your ActiveX and add a parameter whose type is the class. In your ActiveX you can use IDispatch/Ex to get/set the properties.

Sheng Jiang 蒋晟
A: 

Make a global variable or object. Or if you're worried about other funcs accessing and changing the variables then make a singleton. The other option is to return an object. Such as like this

function TOPOSFiscalPrinter.DirectIO(Command: Integer; var pData: Integer;
  var pString: WideString): Integer;

function TOPOSFiscalPrinter.DirectIO(Command, pData, pString){
    ....

    var pObj = {
     d: 0,
     s: '',
     code: ''
    }
    pObj.d = pDataAltertedValue;
    pObj.s = pStringAltertedValue;
    pObj.code = code;
    return pObj;
}

function test() 
{
    var d=1, s="DIRECIO:";
    var r = opos.DirectIO(1024, d, s);
    code = r.code;
    d = r.d;
    s = r.s;



    alert(d); alert(s);
}
Chisum