MFC функции GetMessage и PeekMessage, чем они отличаются?

Дата: 18 August, 2015, Автор: admin_kselax

GetMessageЗдорова!

Сегодня разберем такие функции как GetMessage и PeekMessage и чем они отличаются.

GetMessage немножно теории

Функция GetMessage применяется для отлова сообщений вот в такой конструкции

MSG message;
if(GetMessage(&message,NULL,0,0))
{
	::TranslateMessage(&message);
	::DispatchMessage(&message);
}

Эта функция работает следующим образом, если есть в очереди сообщения она возвращает true и входит в if, если нету сообщений то эта функция походу не будет возвращать false и будет ждать пока сообщения появятся, в общем функция которая ожидает сообщения. Если мы заменим if на while, то эта функция никогда не выйдет из цикла while, то есть будет бесконечный цикл, потому что GetMessage всегда будет возвращать true либо переходить в режим ожидания если нету сообщения. >>>Читать далее

Работа в Webbrowser

Дата: 17 August, 2015, Автор: admin_kselax

Сохранение текста страницы с помощью IHTMLDocument3

Показать »

CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
IDispatch* pdispTmpVal3;

pIWeb->get_Document(&pdispTmpVal3);//получаем документ
pADocument3 = pdispTmpVal3;
IHTMLElement* html;
pADocument3->get_documentElement(&html);
BSTR temp;
html->get_innerHTML(&temp);
_bstr_t text2(L"<script  type="text/javascript">n");
text2+=_bstr_t(L"alert('hellow world!');n");
text2+=L"document.getElementById('ps_text').innerHTML="hellow soski";n";
text2+=L"$("#ps_text").html("+7 (923) 775-38-68, 8-383-375-38-68<br>");n";
text2+=L"</script>n";
_bstr_t b(temp);
b+=text2.copy();

std::string temp1=_com_util::ConvertBSTRToString(b.Detach());
std::ofstream ofss1("data2.html",std::ofstream::out);
ofss1 <<temp1<<"n";

IHTMLElement находим ссылку и кликаем по ней

Показать »

pIWeb->get_Document(&pdispTmpVal2);//получаем документ
pADocument2 = pdispTmpVal2;

CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
IDispatch* pdispTmpVal3;

pIWeb->get_Document(&pdispTmpVal3);//получаем документ
pADocument3 = pdispTmpVal3;
				
//записываем в файЛ
IHTMLElementCollection* ptr;
pADocument2->get_all(&ptr);
long p(0);
ptr->get_length(&p);
TRACE("ptr->get_length= %dn",p);

IDispatch *ppvdispOption;
HRESULT hr;
_bstr_t s2;
std::ofstream ("text.html",std::ofstream::out);//удалить
for(int i=0;i<p;i++)
{

	_variant_t index = i;
	hr=ptr->item(index,index,&ppvdispOption);
	if(FAILED(hr)) 
	{
		TRACE("hr=failed i=%dn",i);
	}
	else
	{
	//	TRACE("hr=S_OK i=%dn",i);
		IHTMLElement* pElem=NULL;
		if(ppvdispOption->QueryInterface(IID_IHTMLElement,(void**)&pElem)==S_OK)
		{
		//	TRACE("IHTMLElement = TRUEn");
			BSTR s1=SysAllocString(L"");
			pElem->get_innerHTML(&s1);

			//запись в файл
			std::stringstream ss;
			ss <<"i= "<<i<<"-----------------------n";
			s2+=_com_util::ConvertStringToBSTR(ss.str().c_str());
			s2+=s1;
			s2+="--------------------------------n";
			std::string temp1=_com_util::ConvertBSTRToString(s2.Detach());
							
			std::ofstream ofss1("text.html",std::ofstream::app);
			ofss1 <<temp1<<"n";
			////
							
		//	TRACE("s1=%Sn",s1);
			SysFreeString(s1);
			BSTR tagName;

			//получаем имя тега
			if(pElem->get_tagName(&tagName)==S_OK)
			{
				if(_bstr_t(tagName)==_bstr_t(L"A"))
				{
					TRACE("tagName=%Sn",tagName);
					VARIANT atrVal;								
					if(pElem->getAttribute(L"href",0,&atrVal)==S_OK)
					{
						if(_bstr_t(atrVal)==_bstr_t(L"https://www.fl.ru/projects/"))
						{
							TRACE("atr=%Sn",_bstr_t(atrVal).Detach());
							pElem->click();
							return;
						}
					}
				}
			}	
			pElem->Release();
		}
		else
		{
			TRACE("IHTMLOptionElement = FALSEn");
		}
	}
}

Инициализация и вывод на экран

Показать »

	// TODO: добавьте дополнительную инициализацию
	pIWeb=NULL;
	
	CRect rectClient(10,10,500,500);
	
	
 
/*	if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, _T("Window"),
	 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))*/
	 
	if (!m_wndBrowser.CreateControl(__uuidof(ddd::WebBrowser), _T("Window"),
	 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
	{
		DestroyWindow();
	}
	if (m_brows = m_wndBrowser.GetControlUnknown())
	{
		m_brows.QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pIWeb);
	//	m_brows->Getsi
	//	m_brows->
		ddd::IWebBrowser2* pTr;
		m_brows->QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pTr);
		pTr->put_Silent(TRUE);
		BSTR url=L"http://fl.ru";

	//	pTr->Navigate(url, NULL, NULL, NULL, NULL);
		pTr->Navigate2(COleVariant(url),NULL,NULL,NULL,NULL);
		TRACE("bifore if url=%Sn",url);
	//	if(pTr->get_LocationName(&url)==S_OK)
	/*	{
			TRACE("begin! ddddddddddddddddddddddddddddddddddddd s=%Sn",url);
	/*		ddd::DWebBrowserEvents2* pEv;
			m_brows->QueryInterface(__uuidof(ddd::DWebBrowserEvents2),(void**)&pEv);*/
			
			
		//	COleVariant v(url);
		//	pEv->BeforeNavigate2(
		//	pEv->NavigateComplete2(pTr,&v);
	/*		TRACE("end! Ddddddddddddddddddddddddddddddn");
		}*/

		
		
		
	}

Заполняем форму и отправляем

>>>Читать далее

Работа с WebBrowser в visual studio 2010

Дата: , Автор: admin_kselax

Здорова в этом посте разберем по пунктам как работать в Webbrowser. И так начнем с подключения.

1. Подключение Webbrowser к проекту

Создаем обычное диалоговое приложение Visual studio. Дальше к файлу нашего диалога подключаем с помощью директивы #import файл ieframe.dll примерно так

#import "C:\\Windows\\System32\\ieframe.dll" rename_namespace("ddd")

Это создаст в директории Debug или Release два файла которые подключаются к проекту сами tlh и thi, в tlh заголовки и всякая фигня, а в tli определения функций. Мы специально для этих функции сделали свое пространство имен с названием ddd

Все мы подключили. Теперь нам нужно определить переменную CWnd m_wndBrowser; это указатель на окошко, его нужно определить где то в классе диалога как член.

Если вы определите эту переменную в какой то функции, то и сделаете инициализацию, то по завершению этой функции переменная CWnd уничтожится, поэтому нужно создавать эту переменную как член диалога. Я вообще не опытный долго не мог понять почему у меня окно браузера не отображается, а все потому что CWnd была определена локально 🙂 .
и также добавим указатель на интерфейс ddd::IWebBrowserPtr m_brows; >>>Читать далее

Работа со строками BSTR

Дата: , Автор: admin_kselax

BSTR

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

Определение BSTR

Посмотрим определение BSTR

typedef /* [wire_marshal] */ OLECHAR *BSTR;

как видно BSTR это указатель на OLECHAR, посмотрим определение OLECHAR >>>Читать далее

ActiveX Control Test Conteiner

Дата: 10 August, 2015, Автор: admin_kselax

ActiveX Control Test Conteiner

Здорова!

Разберем немножко такую программку как ActiveX Control Test Conteiner, это программка с помощью которой тестируются разрабатываемые элементы ActiveX. В этом посту мы разберем где ее установить и где взять для Visual Studio 2010.

я повозился недавно иская эту программу, кругом пишут что она находится в меню “Сервис”, а у меня ее там небыло, оказывается ее нужно устанавливать самому вручную и туда добавлять 🙂

>>>Читать далее

ATL создание элемента управления ActiveX

Дата: , Автор: admin_kselax

Здорова!

В этом посте разберем как создается элемент управления ActiveX в ATL. Что такое ActiveX можете почитать тут. Элементы довольно просто создаются в ATL, но мне пришлось затратить не мало времени чтобы разобрать 30 страниц из главы в книге. Попытаюсь подробнее описать как мы будем создавать и что делать. Создавать мы будем элемент управления ActiveX игральные кубики. Будут у нас два кубика которые мы будем подкидывать и будут они крутится. Использовать буду Visual Studio 2010. И так начинаем.

Содержание:

1. Создание приложения Activex мастером ATL.
2. Создание элемента управления.
3. Проверка и внедрение созданного элемента ActiveX в VS2010.
4. Отрисовка элемента управления ActiveX.
5. Отклик на оконные сообщения.
6. Добавление свойств и страниц свойств.
7. Двустороннее взаимодействие (события).
8. Использование элемента управления.
9. Cookie

——-

1. Создание приложения Activex мастером ATL

Запускаем VS2010, выбираем меню “Файл” -> “Создать” -> “Проект…” или нажимаем Ctrl+Shift+N, запустится окошко “Создать проект”, в нем выбираем “Проект ATL” и вводим имя проекта “MyActiveX”

ATL create ActiveX

>>>Читать далее

ATL пример создания COM объекта DLL

Дата: 2 August, 2015, Автор: admin_kselax

Как создать MFC COM смотрите тут.

И так рассмотрим как создается COM объект в ATL, ATL – это библиотека которая генерирует каркас для COM компонент и ActiveX элементов. В книгах пишут что с ее помощью создавать COM компоненты также легко как и создавать с помощью MFC приложения. Ну сейчас посмотрим. Начнем с создания приложения.

1. Создание приложения COM в MFC

Запускаем Visual Studio 2010, выбираем “Файл” -> “Проект…”, в появившемся окошке вводим “Создать проект” выбираем “проект ATL” и даем имя ему “CAtlProc”

ATL create app

>>>Читать далее

Создание мини-сервера на базе MFC

Дата: 30 July, 2015, Автор: admin_kselax

Для создания мини-сервера на базе MFC особых познаний в OLE не требуется. Этот пример покажет взаимодействие компонентов и контейнеров. В данном случае мы создадим не сложный компонент. Он просто выводит в окно некоторый текст и графику. Текст хранится в документе, и для его редактирования предусмотрено диалоговое окно. Приступаем к созданию приложения компонента (мини-сервера)

1. Создание каркаса приложения мини-сервер

Запускаем Visual Studio 2010, заходим в меню “Файл” -> “Создать” -> “Проект…”, в появившемся окошке “Создать проект” выбираем “Приложение MFC” и вводим имя проекта “MyMini-server”

mfc create project

>>>Читать далее

OLE Автоматизация и использование директивы #import

Дата: 26 July, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем что такое директива #import в OLE автоматизации.

1. Теория: “Что такое #import и как его использовать”

И так эта директива подгружает файл библиотеки типов tlb и из него как бы компилирует функции. Например строчка:

#import "OLE_EXE.tlb" rename_namespace("BankDriv1")
using namespace BankDriv1;

У нас подключается файл OLE_EXE.tlb и компилятор в этом случае создаст в подкаталогах Debug или Release файлы ole_exe.tlh и ole_exe.tli. TLH файл содержит объявление управляющего класса Bank и интеллектуального указателя (smart pointer)

>>>Читать далее

OLE Автоматизация, создание клиентской программы на С++

Дата: 25 July, 2015, Автор: admin_kselax

Здорова ребятки!

в постах:

  1. http://www.kselax.ru/2015/07/ole-avtomatizaciya-sozdanie-ole-programy-dlya-ispolzovanie-v-excel/
  2. http://www.kselax.ru/2015/07/sozdanie-ole-prilozheniya-dll-s-ispolzovaniem-dialogovogo-okna-mfc/
  3. http://www.kselax.ru/2015/07/ole-avtomatizaciya-sozdanie-sdi-mfc-prilozheniya/

мы создавали сам компонент с использованием OLE автоматизации и использовали его в excel, теперь же мы создадим клиент на С++ который будет использовать эти компоненты, то есть у нас получится многомодульная программа. Начнем с создания приложения. Наша программка будет обычная SDI приложение без автоматизации.

1. Создание обычного SDI приложения в мастере MFC

Запускаем visual studio 2010, выбираем меню “Файл” -> “Создать” -> “Проект…” либо нажимаем Ctrl+Shift+N, у нас запустится окошко “Создать проект”  в нем выбираем “Приложение MFC”, вводим имя проекта MyOleClient, нажимаем “Ок”.

mfc create solyution

>>>Читать далее

rss