Приложения-клиенты СОМ. Создание приложения «Hello World»

   
На этом шаге мы рассмотрим алгоритм создания приложения "Hello World".

  • Создание приложения EncodeHello.
  • В меню File выберите New. В качестве типа проекта укажите Win32 Console Application
    и введите название проекта - EncodeHello. Щелкните ОК.
  • В окне 1 мастера Win32 Console Application Wizard выберите A simple application и щелкните
    Finish. Щелкните OK, чтобы подтвердить создание проекта.
  • Скопируйте файлы EncodeServer.h и EncodeServer_i.c из папки проекта EncodeServer в
    проект EncodeHello.
  • В FileView найдите и откройте файл EncodeHello.cpp. В начало файла добавьте следующие строки:
    #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().

  • Соберите и запустите приложение EncodeHello. Убедитесь в корректности его работы.

Текст этого приложения можно взять здесь (12,0 Кб).

   
Результат работы приложения изображен на рисунке 1:


Рис.1. Результат работы приложения

   
На следующем шаге мы рассмотрим поддержку COM в компиляторе Visual C++.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий