netlib.narod.ru< Назад | Оглавление | Далее >

Инициализация сетевого объекта

Первый этап DirectPlay — создание сетевого объекта, будь это сервер, клиент или одноранговый пользователь. Для инициализации интерфейса каждой из этих сетевых моделей вы должны использовать функцию CoCreateInstance (которая детально описана в главе 4, «Воспроизведение звуков и музыки с DirectX Audio и DirectShow»), указав соответствующий идентификатор класса и интерфейса из представленных ниже:

CLSID_DirectPlay8Address    IID_IDirectPlay8Address
CLSID_DirectPlay8Client     IID_IDirectPlay8Client
CLSID_DirectPlay8Peer       IID_IDirectPlay8Peer
CLSID_DirectPlay8Server     IID_IDirectPlay8Server

Так, чтобы используя CoCreateInstance создать объект сервера, воспользуйтесь следующим фрагментом кода:

IDirectPlay8Server *pDPServer;

if(FAILED(CoCreateInstance(CLSID_DirectPlay8Server,
                           NULL, CLSCTX_INPROC,
                           IID_IDirectPlay8Server,
                           (void**)&pDPServer))) {
    // Произошла ошибка
}

 

ВНИМАНИЕ!
Убедитесь, что вы инициализировали систему COM до вызова CoCreateInstance или любой функции DirectPlay. Для приложений, которые не используют несколько потоков (однопоточных), добавьте следующую строку до каких-либо обращений к DirectX:
CoInitialize(NULL);
С другой стороны, если вы применяете многопоточность, используйте следующий вызов:
CoInitializeEx(NULL, COINIT_MULTITHREADED);
Когда приложение завершает работу, не забудьте вызвать CoUninitialize, как показано ниже:
CoUninitialize();

Независимо от того, какой сетевой объект вы создаете (клиент, одноранговый или сервер), необходимо создать соответствующую сетевую функцию обратного вызова. Эта функция вызывается каждый раз, когда принято сетевое сообщение. Вот как выглядит ее прототип:

typedef HRESULT (WINAPI *PFNDPNMESSAGEHANDLER)(
    PVOID pvUserContext, // Предоставляемый приложением указатель
    DWORD dwMessageType, // Тип полученного сообщения
    PVOID pMessage);     // Буфер с зависящими от сообщения данными

Переменная pvUserContext — это указатель на какие-либо данные, которые вы хотите связать с игроком; этот указатель инициализируется при создании игрока. Он может быть указателем на структуру, хранящую состояние игры, или любую другую информацию по вашему желанию. Аргументы dwMessageType и pMessage относятся к сообщениям, и вы узнаете о них в разделе «Получение данных» далее в этой главе.

Сейчас можно пропустить создание самой функции обратного вызова и продолжить инициализацию сетевого объекта. Для завершения инициализации вызовите следующую функцию:

HRESULT IDirectPlay8Server::Initialize(
     PVOID const pvUserContext,     // Предоставляемый пользователем указатель
     const PFDNPMESSAGEHANDLER pfn, // Функция обратного вызова
                                    // для обработки сообщений
     const DWORD dwFlags);          // 0

 

ПРИМЕЧАНИЕ
Функция Initialize (с теми же самыми параметрами) работает в каждой из моделей:
HRESULT IDirectPlay8Client::Initialize(...);
HRESULT IDirectPlay8Peer::Initialize(...);

Вот пример создания вашей собственной функции обратного вызова (сейчас это только прототип) и инициализации только что созданного сетевого объекта сервера:

// Прототип функции обратного вызова
HRESULT WINAPI MessageHandler(PVOID pvUserContext,
                              DWORD dwMessageId, PVOID pMsgBuffer);
// Инициализация ранее созданного объекта pDPServer
if(FAILED(pDPServer->Initialize(NULL, MessageHandler, 0))) {
    // Произошла ошибка
}

Вот и все, что относится к созданию и инициализации сетевых объектов. Следующий этап — создание объекта адреса.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz