Вход/Регистрация
Интернет-журнал "Домашняя лаборатория", 2007 №6
вернуться

Журнал «Домашняя лаборатория»

Шрифт:

IJournal* pIJournal = NULL;

BSTR bstr;

char* pszText;

HRESULT hr;

int nNewID = 0;

IPub* alPub[MAX_ID]; // массив указателей на публикации

bstr = SysAllocString(L"");

// Активация фабрики класса CoBookFactory и получение указателя на интерфейс IClassFactory этой фабрики (pBF)

hr = CoGetClassObject(CLSID_CoBook, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void**)&pBF);

if(FAILED(hr)) // в случае неудачи — выход

return 0;

// Активация фабрики класса CoJournaiFactory и получение указателя на интерфейс IClassFactory этой фабрики (pJF)

hr = CoGetClassObject(CLSID_CoJournal, CLSCTX_INPROC_SERVER,

NULL, IID_IClassFactory, (void**)&pJF);

if(FAILED(hr)) // в случае неудачи — выход

return 0;

// Активация нового экземпляра кокласса CoBook

hr = pBF —> CreateInstance(NULL, IID_IBook, (void**)SpIBook);

// В случае успеха — ввод данных

if (SUCCEEDED(hr))

{

SysReAllocString(&bstr, L" A.W.Troelsen");

pIBook — > SetAuthor(bstr);

SysReAllocString(&bstr, L" COM and ATL 3.0");

pIBook -> SetTitle(bstr);

pIBook —> SetYear(2000);

alPub [nNewID+ +] = pIBook;

}

// Активация нового экземпляра кокласса CoJournal

hr = pJF —> CreateInstance(NULL, IID_IJournal, (void**)SpIJournal);

// В случае успеха — ввод данных

if (SUCCEEDED(hr))

{

SysReAllocString(&bstr, L" The Journal of the Graph Theory");

pIJournal —> SetTitle(bstr);

pIJournal —> SetYear(2001);

pIJournal —> SetNumber(1);

aIPub[nNewID++] = pIJournal;

}

// Активация нового экземпляра кокласса CoJournal

hr = pJF->CreateInstance(NULL, IID_IJournal, (void**)SpIJournal);

// В случае успеха — ввод данных

if (SUCCEEDED(hr))

{

SysReAllocString(&bstr, L" SIGIR");

pIJournal —> SetTitle(bstr);

pIJournal —> SetYear (1999);

pIJournal —> SetNumber(12);

aIPub[nNewID++] = pIJournal;

}

// Удаление фабрик классов

pBF —> Release ;

pJF->Release ;

// Вывод информации о всех публикациях

if(nNewID)

for(int id = 0; id < nNewID; id++)

{

SysFreeString (bstr);

aIPub[id] — > GetInfo(&bstr);

pszText = (char*)malloc(2*SysStringLen(bstr));

wcstombs(pszText, bstr, 2*SysStringLen(bstr));

MessageBox (NULL, pszText, "Publication",

MB OK|MB SETFOREGROUND);

free(pszText);

}

// Удаление всех публикаций

if(nNewID)

for(int id = 0; id < nNewID; id++)

{

aIPub[id] — > Release ;

}

SysFreeString(bstr);

CoUninitialize ; // Завершение работы с COM

return 0;

}

Несколько замечаний к приведенной программе.

СОМ функция CoGetClassObject имеет следующие параметры:

• Ссылка на идентификатор создаваемого кокласса

• Тип запрашиваемого сервера CLSCTX_INPROC_SERVER означает, что запрашивается сервер в процессе клиента. Дня локального сервера надо задать СLSСТX_LОСAL_SЕRVER, и для удаленного — CLSCTX_REMOTE_SERVER. Можно комбинировать эти флаги для автоматического выбора наиболее близкого сервера.

• В третьем параметре задается информация об удаленной машине при использовании удаленного сервера.

• Идентификатор запрашиваемого интерфейса

• Возвращаемый указатель на запрашиваемый интерфейс

Функция MessageBox используется для вывода информации о публикации в окне сообщений. Эту информация клиент получает с сервера вызывав метод GetInfо. Память под возвращаемую BSTR– строку сервер выделяет сам, а клиент отвечает за ее освобождение. Перед передачей информации в окно сообщений выполняется преобразование BSTR– строки в ANSI– строку.

  • Читать дальше
  • 1
  • ...
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: