Для использования механизма взаимодействия с другими программами через механизм OLE (Windows) удобно пользоваться объектом ts_idispatcher и одноименной функцией.

Это позволяет создавать собственные функции и манипулировать различными программами Windows. Например, если не хватает имеющихся функций в LABPP_Automat для  работы с Excel можно создавать свои собственные процедуры.


Пример 1.

Подключиться к текущей активной таблице Excel чтобы считать значение из текущей ячейки.

Полученное значение вывести в окно сообщений программы.


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

// Example

// Read number current cell in Excell table

// LABPP 2022

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

int main()

{

    int iIDispatchExcel;

    object("create","ts_idispatch",iIDispatchExcel);

    ts_idispatch(iIDispatchExcel,"attach","Excel.Application");  // create dispatcher object 


    int iVariantRange;

    object("create","ts_variant",iVariantRange);   // create variant object to obtain dispatcher object of the current active cell

    int ires = ts_idispatch(iIDispatchExcel, "AutoWrap", iVariantRange, "DISPATCH_PROPERTYGET", "ActiveCell", 0);


    if(ires != 0) {

          return -1;

    }


    int iIDispatchActiveCell;

    object("create","ts_idispatch",iIDispatchActiveCell);

    ts_variant(iVariantRange,"get_pdispVal", iIDispatchActiveCell);


    int iVariantParm;

    object("create","ts_variant",iVariantParm);

//    ts_variant(iVariantParm,"set_dblVal",111.10);

//    ts_variant(iVariantParm,"set_bstrVal","Stop War");

 

    ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantParm,"DISPATCH_PROPERTYGET", "FormulaR1C1", 0);

//    ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantParm,"DISPATCH_PROPERTYGET", "Value", 0);


    if (ires == 0)

    {

        string s;

        ts_variant(iVariantParm, "get_value_simple",s);

        coutvar << s;

        int i;

        ts_variant(iVariantParm, "get_value_simple",i);

        coutvar << i;

        double d;

        ts_variant(iVariantParm, "get_value_simple",d);

        coutvar << d;

    }

    object("delete",iVariantParm);

    object("delete",iVariantRange);

    object("delete",iIDispatchActiveCell);


    ts_idispatch(iIDispatchExcel,"detach");

    object("delete",iIDispatchExcel);

}


Пример 2.

Подключиться к текущей активной таблице Excel чтобы записать значение в текущую ячейку.


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

// Example

// Write number 111.10 to current cell in Excell table

// LABPP 2022

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

int main()

{

    int iIDispatchExcel;

    object("create","ts_idispatch",iIDispatchExcel);

    ts_idispatch(iIDispatchExcel,"attach","Excel.Application");  // create dispatcher object 


    int iVariantRange;

    object("create","ts_variant",iVariantRange);   // create variant object to obtain dispatcher object of the current active cell

    int ires = ts_idispatch(iIDispatchExcel, "AutoWrap", iVariantRange, "DISPATCH_PROPERTYGET", "ActiveCell", 0);


    if(ires != 0) {

          return -1;

    }


    int iIDispatchActiveCell;

    object("create","ts_idispatch",iIDispatchActiveCell);

    ts_variant(iVariantRange,"get_pdispVal", iIDispatchActiveCell);


    int iVariantParm;

    object("create","ts_variant",iVariantParm);

//    ts_variant(iVariantParm,"set_dblVal",111.10);

    ts_variant(iVariantParm,"set_value_simple","Stop War");

 

    int iVariantNull;

    object("create","ts_variant",iVariantNull);


    ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantNull,"DISPATCH_PROPERTYPUT", "FormulaR1C1", 1, iVariantParm);


    object("delete",iVariantParm);

    object("delete",iVariantRange);

    object("delete",iIDispatchActiveCell);

    object("delete",iVariantNull);


    ts_idispatch(iIDispatchExcel,"detach");

    object("delete",iIDispatchExcel);

}