На этом шаге мы рассмотрим алгоритм создания приложения "Hello World".
#include <iostream.h> #include "EncodeServer.h" #include "EncodeServer_i.c"
int main(int argc, char* argv[]) { ::CoInitialize( NULL ); IEncoder * pServer; HRESULT hr = ::CoCreateInstance( CLSID_Encoder, NULL, CLSCTX_INPROC_SERVER, IID_IEncoder, (void **) &pServer ); if( SUCCEEDED( hr ) ) { short nKey = 1; cout << "Enter a code key between -5 and 5: "; cin >> nKey; wchar_t wstrHello[ 16 ] = L"Hello World"; BSTR bstrHello = ::SysAllocString( wstrHello ); BSTR bstrCodedHello; HRESULT hr = pServer->put_Key( nKey ); if( FAILED( hr )) goto ComError; hr = pServer->EncodeString( bstrHello, &bstrCodedHello ); if( FAILED( hr )) goto ComError; char strOut[ 16 ]; wcstombs( strOut, bstrCodedHello, 16 ); cout << "\n" << strOut << "\n\n"; ComError: if( FAILED( hr )) cout << "COM Error" << "\n\n"; ::SysFreeString( bstrHello ); ::SysFreeString( bstrCodedHello ); pServer->Release(); } ::CoUninitialize(); return 0; }
Функция CoInitialize() вызывает CoInitializeEx() с параметром COINIT_APARTMENTTHREADED. На 160 шаге мы говорили, как вызывать CoInitializeEx() для инициализации библиотеки СОМ в текущем потоке и указания типа потоковой модели создаваемого СОМ-объекта. Каждое обращение к CoInitialize() или CoInitializeEx() должно сопровождаться последующим вызовом CoUninitialize() - функции, закрывающей библиотеку СОМ в текущем потоке.
Содержащийся в EncodeHello.cpp код довольно прямолинеен: создается экземпляр СОМ-объекта Encoder, свойству Key присваивается заданное пользователем значение и затем вызывается метод EncodeString(), который и шифрует строку "Hello World".
Обратите внимание на вызов IUnknown::Release() в конце тела функции. Как уже говорилось на 150 шаге, при получении указателя на интерфейс с помощью CoCreateInstance() значение счетчика использования увеличивается. После завершения работы с указателем интерфейса именно клиент отвечает за уменьшение значения счетчика, для чего и вызывается Release().
Результат работы приложения изображен на рисунке 1:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим поддержку COM в компиляторе Visual C++.