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))) { // Произошла ошибка }
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
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 | < Назад | Оглавление | Далее > |