Справочное руководство по TDMS 7.0 API
C++
Смотри также Отправить замечание

Glossary Item Box

Исходный текст

//---------------------------------------------------------
// Пример использования TDMSApplication.
// Базовый для всех остальных примеров.
// Получает приложение и выводит список типов атрибутов.
//---------------------------------------------------------

#include <stdio.h>

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

// ATL
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>

//#import "TDMSOle.dll" no_namespace raw_interfaces_only named_guids
#include "TDMSOle.tlh"

#define CSW2A(lpw) ((lpw==NULL)?"":W2A(lpw))

//---------------------------------------------------------
__inline void CheckError(HRESULT hr) {
    if (FAILED(hr)) throw hr;
}

//---------------------------------------------------------
void ShowErrorMessage(HRESULT hr)
{
    if (FAILED(hr)) {
        PCSTR sInfo = "Unknow Error";
        CComPtr<IErrorInfo> pErrorInfo;
        if (SUCCEEDED(GetErrorInfo(0, &pErrorInfo)) && pErrorInfo != NULL) {
            BSTR bsInfo;
            if (SUCCEEDED(pErrorInfo->GetDescription(&bsInfo))) {
                USES_CONVERSION;
                sInfo = CSW2A(bsInfo);
                SysFreeString(bsInfo);
            }
        }
        MessageBox(NULL, sInfo, "TDMS Error", MB_OK | MB_ICONERROR);
    }
}

//---------------------------------------------------------
HRESULT GetTDMSApp(ITDMSApplication** ppTDMSApp)
{
    if (!ppTDMSApp)
        return E_POINTER;

    *ppTDMSApp = NULL;

    CComPtr<IUnknown> pUnk;
    HRESULT hr = ::GetActiveObject(__uuidof(TDMSApplication), NULL, &pUnk);
    if(SUCCEEDED(hr))
        return pUnk.QueryInterface(ppTDMSApp);
    else
        return CoCreateInstance(__uuidof(TDMSApplication), NULL, CLSCTX_LOCAL_SERVER, IID_ITDMSApplication, reinterpret_cast<void**>(ppTDMSApp));
        
    return E_FAIL;
}

//---------------------------------------------------------
// Показывает диалог выбора объекта.
// Возвращает: FALSE - если пользователь выбрал "Отмена".
//---------------------------------------------------------
BOOL SelectObject(ITDMSObject* *ppObject, ITDMSApplication* pApp, ITDMSObjects* pSelectFromObjects)
{
    // получить диалог выбора объекта
    CComPtr<ITDMSDialogs> pDialogs;
    CheckError(pApp->get_Dialogs(&pDialogs));
    CComPtr<ITDMSSelectObjectDlg> pSelectObjectDlg;
    CheckError(pDialogs->get_SelectObjectDlg(&pSelectObjectDlg));
    
    // выбрать из указанных объектов
    if (pSelectFromObjects != NULL)
        CheckError(pSelectObjectDlg->put_SelectFromObjects(pSelectFromObjects));

    // показать диалог
    VARIANT_BOOL bResult;
    CheckError(pSelectObjectDlg->Show(&bResult));
    if (!bResult)
        return FALSE;

    // получить первый выбранный объект
    CComPtr<ITDMSObjects> pObjects;
    CheckError(pSelectObjectDlg->get_Objects(&pObjects));
    VARIANT varItem;
    varItem.vt = VT_I4;
    varItem.lVal = 0;
    CheckError(pObjects->get_Item(varItem, ppObject));

    return TRUE;
}

//---------------------------------------------------------
int main(int argc, char* argv[])
{
    USES_CONVERSION;

    // initialize COM
    if (FAILED(OleInitialize(NULL))) {
        printf("Failed to initialize COM libraries.\n");
        return 1;
    }

    try {

        // get TDMS application object
        CComPtr<ITDMSApplication> pApp;
        if (FAILED(GetTDMSApp(&pApp))) {
            printf("Failed to get TDMS Application.\n");
            return 1;
        }
        printf("Successfully got TDMS Application.\n");

        // login
        BSTR bsUser = A2BSTR("sysadmin");
        BSTR bsPassword = A2BSTR("");
        pApp->Login(bsUser, bsPassword);
        SysFreeString(bsUser);
        SysFreeString(bsPassword);

        // make application window visible
        //pApp->put_Visible(TRUE);

        // get attribute definitions collection
        CComPtr<ITDMSAttributeDefs> pAttrDefs;
        CheckError(pApp->get_AttributeDefs(&pAttrDefs));
        
        // show information for each attribute definition in the collection
        printf("%-20s %-5s %-20s\n", "SysName", "Type", "Description");
        long lCount;
        CheckError(pAttrDefs->get_Count(&lCount));
        for (long i = 0; i < lCount; i++) 
        {
            // get attribute definition
            CComPtr<ITDMSAttributeDef> pAttrDef;
            VARIANT varItem;
            varItem.vt = VT_I4;
            varItem.lVal = i;
            CheckError(pAttrDefs->get_Item(varItem, &pAttrDef));
            // print information
            TDMSDataType type;
            BSTR bsSysName, bsDescription;
            CheckError(pAttrDef->get_SysName(&bsSysName));
            CheckError(pAttrDef->get_Description(&bsDescription));
            CheckError(pAttrDef->get_Type(&type));
            printf("%-20s %-5d %-20s\n", CSW2A(bsSysName), type, CSW2A(bsDescription));
            SysFreeString(bsSysName);
            SysFreeString(bsDescription);
        }
    
    } catch(HRESULT hr) {
        ShowErrorMessage(hr);
        return hr;
    }

    OleUninitialize();

    return 0;
}

//---------------------------------------------------------
//---------------------------------------------------------
© 2023 CSoft Development. Все права защищены.