Использование ActiveX компонентов в серде Visual C++, страница 4

{

            DISPID dispid;

            WCHAR * name=L"TextMatrix";

            pDisp->GetIDsOfNames(IID_NULL,&name,1,LOCALE_SYSTEM_DEFAULT,&dispid);

            DISPPARAMS dispparams;

            DISPID mydispid[1] = { DISPID_PROPERTYPUT };

            VARIANTARG vararg[3];    // Три параметра

            dispparams.rgvarg = vararg;

            VariantInit(&dispparams.rgvarg[0]);           //Инициализируем первый

            dispparams.rgvarg[0].vt = VT_BSTR;   // 32-bit integer

            dispparams.rgvarg[0].bstrVal  = SysAllocString(L"Parameters");   //Размещение системной строки в формате BSTR

            VariantInit(&dispparams.rgvarg[1]);//Инициализируем второй

            dispparams.rgvarg[1].vt = VT_I4;   // 32-bit integer для номера столбца

            dispparams.rgvarg[1].lVal  = 0;        //Номер столбца

            VariantInit(&dispparams.rgvarg[2]);//Инициализирует третий

            dispparams.rgvarg[2].vt = VT_I4;   // 32-bit integer для номера строки

            dispparams.rgvarg[2].lVal  = 0;        //Номер строки

            dispparams.rgdispidNamedArgs = mydispid;

            dispparams.cArgs = 3;      // Передаем три параметра

            dispparams.cNamedArgs = 1;  

            hr=pDisp->Invoke(dispid, IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT,

                                                           &dispparams,NULL,NULL,NULL);

            SysFreeString(dispparams.rgvarg[0].bstrVal);//Освобождаем системную строку

}

10. Прочитаем свойство из компонента. В OLE/COM Object Viewer'e находим свойство TextMatrix с флагом propget и определяем количество и типы параметров – их 2 32 битных числа и строка – как возвращаемый параметр (флаги параметра out,retval). Прокомментируем отличающиеся от предыдущих строки

{

            DISPID dispid;

            WCHAR * name=L"TextMatrix";

            pDisp->GetIDsOfNames(IID_NULL,&name,1,LOCALE_SYSTEM_DEFAULT,&dispid);

            DISPPARAMS dispparams;

            VARIANTARG vararg[2]; // два входных параметра

            dispparams.rgvarg = vararg;

            VariantInit(&dispparams.rgvarg[0]);

            dispparams.rgvarg[0].vt = VT_I4;  

            dispparams.rgvarg[0].lVal  = 1; 

            VariantInit(&dispparams.rgvarg[1]);

            dispparams.rgvarg[1].vt = VT_I4;  

            dispparams.rgvarg[1].lVal  = 0;  

            dispparams.cArgs = 2;      //Два входных параметра

            dispparams.cNamedArgs = 0;   // свойство мы не изменяем – параметров для DISP_PROPERTYPUT  - 0

            VARIANT varRez;    //Переменная вариантного типа для возвращаемого значения

            hr=pDisp->Invoke(dispid, IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,

                                                           &dispparams,

&varRez,        // Указываем в какую переменную возвращать значение

NULL,NULL);

            if(varRez.vt==VT_BSTR)     //Если получена строка – выводим ее

                        ::MessageBoxW(m_hWnd,varRez.bstrVal,L"Cell text",MB_OK);

}

   pDisp->Release(); //Освобождаем интерфейс

}

11.Запускаем программу и тестируем приложение(рис.24).

Рис.24


Индивидуальное задание.

Тремя методами обеспечить обмен данными собственного приложения с компонентом, указанным преподавателем.