Шрифт:
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– строку.