Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

4.13.4. Создание тестового клиента.

Как первый сервер, так и наш тестовый клиент будут простыми. Создадим консольное приложение Win32, названное FirstSrvClient (выберите опцию создания пустого приложения), а затем добавим файл C++ (main.cpp). В этом файле мы создадим программный код простой функции main () для создания экземпляров нашего сервера и вызова его метода DoSomething.

Для доступа к интерфейсу IFirstlnterfасе нужен файл firstsrv.h, сгенерированный компилятором MIDL. Для доступа к идентификаторам CLSID и IDD — файл firstsrv_i.с, также сгенерированный компилятором MIDL. Далее мы инициализировали СОМ вызовом функции CoIlnitialize (с которой сопряжена используемая при завершении работы функция CoUnitialize). Затем мы вызвали функцию CoCreateInstance, использовав CLSID_FIRSTComponent в качестве идентификатора CLSID требуемого компонента, и IID_FirstInterfасе в качестве идентификатора IID требуемого интерфейса. Мы ожидаем возврата указателя интерфейса в переменную pFI.

Далее мы проверяем возвращаемое значение типа HRESULT. В случае успеха мы просто вызываем метод DoSomething и освобождаем ссылку на интерфейс (помните: функция CoCreateInstance возвращает указатель интерфейса, добавленный функцией AddRef, так что мы должны предоставить соответствую­щую операцию Release для его освобождения). Наконец, мы деинициализируем СОМ вызовом функции CoUninitialize. Соответствующий программный код приведен в листинге 2.6.

Листинг 2.6. Тестовый клиент для IFirstInterface (main.cpp)

// main.cpp

#include <windows.h>

#include ". .\FirstSrvDll\firstsrv.h"

#include ". .\FirstSrvDll\firstsrv_i.c"

int main()

{

// Инициализация COM

CoInitialize(NULL);

// Создание экземпляра FirstComponent

// и получение указателя на IFirstInterfасе

IFirstInterface* pFI=NULL;

HRESULT hr=CoCreateInstance(CLSID_FirstComponent,NULL,

CLSCTX_INPROC_SERVER,

IID_IFirstInterface, reinterpret_cast<void**>(&pFI));

if (FAILED(hr))

{

MessageBox(NULL,"Could not create instance (He могу создать интерфейс)", "Error in CoCreatelnstance (Ошибка в CoCreatelnstance) ",

MB_OK + MB_ICONSTOP);

}

else

{

// Использование интерфейса

pFI->DoSomething();

// Освобождение ссылки на интерфейс

pFI->Release(); .

}

CoUninitialize();

return 0;

}

Следующий этап - построение и запуск тестового клиента. Вы должны получить окно сообщения “We did it!”.

Чтобы лучше понять, как эти два компонента работают совместно, пройдем по программному коду строка за строкой, отслеживая ход исполнения программы от клиента к серверу СОМ и назад к клиенту. Выполните код по следующему алгоритму.

1. Выполните построение отладочной версии сервера и клиента.

2. Откройте проект FirstSrv.

3. Выберите команду Project>Settings (Проект>Установки). На вкладке Debug отобразившегося окна в поле Executable for Debug Session (Выполняемый модуль для сеанса отладки) укажите путь к исполняемому клиентскому модулю: FirstSrvCIient.exe.

4. Поместите точку останова в функции DllGetClassObject и DllCanUnloadNow.

5. Откройте файл клиентской программы main.cpp и поместите точку останова на вызове функции CoCreateInstance.

6. Нажмите клавишу F5 и начните отладку.

7. Выполняйте пошаговое перемещение по коду программы с помощью клавиши F10, перешагивая через вызовы функций (например, g_FirstClassFactory QueryInterfасе).

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