Script Control Problem!



  • Hallo,
    Ich hoffe, dass mir hier einer bei meinem problem weiterhelfen kann...
    Folgendes, ich benötige etwas, mit dem ich beliebige Skripte (Skriptsprachen)in meine Applikation einbauen kann und das Skript durch eigene Funktionen aus der Applikatoin erweitern kann.

    Hierfür hat sich nach erstem forschen dann auch gleich ein Script Control Objekt MSScriptControl angeboten...

    Nun habe ich aber riesige probleme das teil richtig zum laufen zu bekommen...
    Ich kann keine Parameter by reference übergeben bzw. ich kann diese im Skript zwar verändern aber im c++ source nicht wieder auslesen. Zudem hab ich keine ahnung , wie ich neue Funktionalitäten in c++ definieren kann, damit ich diese im Skript dann verwenden kann

    Hier ist beispielsource zu meinem Problem:

    void __fastcall TFormScriptSample::pButtonRunScriptClick(TObject *Sender)
    {
    try
    {
    //Array, um Parameter dem Skript zur Verfügung zu stellen
    SAFEARRAY *sa;

    //Initialisiert Dimension und Elementanzahl des SAFEARRAY
    SAFEARRAYBOUND rgsabound[1];

    //Dimensionen: 1
    rgsabound[0].lLbound = 1;
    //einzufügende Elemente: 3
    rgsabound[0].cElements = 3;

    sa = SafeArrayCreateVector(VT_VARIANT,1,3);
    long x[3];
    long *pX = x;

    Variant result;
    pScriptControl->Language = "VBScript";
    pScriptControl->Reset();
    //Initialisieren der beiden Übergabeparameter
    Variant vParam[3];
    vParam[0] = WideString("1111111");
    vParam[1] = WideString("2222222");
    vParam[2] = WideString("3333333");
    for(int i =0; i<3; i++)
    {
    x[i] = i+1;
    // Hier ist nur wichtig, dass die Anzahl der Parameter mit der im Script übereinstimmt
    //(hier 3 stück, da in for schleife...) --> Bezeicher müssen nicht gleich sein
    //zu übergebende Parameter: (SAFEARRAY, Parameter Index, Parameter Referenz)
    SafeArrayPutElement(sa,pX,&vParam[i]);
    pX++;
    }

    String sEditText = pRichEditVBScript->Text;
    pScriptControl->AddCode(WideString(sEditText));
    result = pScriptControl->Run(WideString("test"),&sa);

    pScriptControl->ExecuteStatement(WideString("MsgBox (\"Hello\")"));
    ShowMessage("Test Result = " + result);

    //here s.th does not work... i'd like to get the modified
    //parameter value but it still is "333333" 😞
    //i can only achieve the params as return value "result"...
    Variant i ;
    SafeArrayGetElement(sa,pX,&i);
    ShowMessage(i);
    SafeArrayDestroy(sa);

    }
    catch(Exception &e)
    {
    ShowMessage(e.Message);

    }

    }

    //-----------------------------------------------------------------------------

    void __fastcall TFormScriptSample::FormCreate(TObject *Sender)
    {
    pScriptControl->AllowUI = true;
    }

    Im Textfeld steht dann folgendes :

    '-------------------------------------------
    'in the ChangeParam function the call by ref works...
    Function ChangeParam(param)
    param = "i am changed"
    End Function

    '-------------------------------------------
    Function Test(param1, param2, param3)
    MsgBox "param3 = " &param3
    ChangeParam param3
    MsgBox "param3 = " &param3
    Test = param1 + " " + param2 + " " + param3
    End Function

    Ich bin für jede hilfe dankbar
    Mfg
    splash


Anmelden zum Antworten