Исходный текст
//---------------------------------------------------------
// Пример использования 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;
}
//---------------------------------------------------------
//---------------------------------------------------------