Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

Клиент

Теперь можно реализовать клиента для сервера PubInProcServer. Для этого можно в Visual C++ создать проект консольного приложения PubClient, куда перенести файлы iid.h, iid.cpp и все файлы с описаниями интерфейсов. Тем самым, клиент должен знать все GUID используемых коклассов

и их интерфейсов (не обязательно всех в данном классе, но всех, используемых данным клиентом).

Сам клиент реализован в файле PubClient.cpp

// PubClient.cpp — клиент для сервера PubinProcServer

#include "IBook.h"

#include "IJournal.h"

#include "iid.h"

#include <iostream.h>

define MAX_ID 100 // максимальное число публикаций

int main

{

CoInitialize(NULL); // инициализация COM

IClassFactory* pBF = NULL;

IClassFactory* pJF = NULL;

IBook* pIBook = NULL;

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

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

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Разбитная разведёнка

Балер Таня
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Разбитная разведёнка

Вспомнить всё (сборник)

Дик Филип Киндред
Фантастика:
научная фантастика
6.00
рейтинг книги
Вспомнить всё (сборник)

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Полковник Гуров. Компиляция (сборник)

Макеев Алексей Викторович
Полковник Гуров
Детективы:
криминальные детективы
шпионские детективы
полицейские детективы
боевики
крутой детектив
5.00
рейтинг книги
Полковник Гуров. Компиляция (сборник)

Отверженный VI: Эльфийский Петербург

Опсокополос Алексис
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург

На распутье

Кронос Александр
2. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На распутье

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Ни слова, господин министр!

Варварова Наталья
1. Директрисы
Фантастика:
фэнтези
5.00
рейтинг книги
Ни слова, господин министр!

Купец VI ранга

Вяч Павел
6. Купец
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Купец VI ранга

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский