Proxy Switcher на MFC скачать, исходник

Дата: 9 September, 2015, Автор: admin_kselax

Прокси свичер, программка для смены прокси. Полностью меняет прокси на компе, прописывает в реестре. (Ссылка на скачивание программки в самом низу)

Proxy Switcher

Можно устанавливать как один прокси, так можно и добавить список в файле и перебирать.

Добавляем один прокси

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

Собственные функции MFC

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

Функция создает процесс CreateProcess и перенаправляет вывод

Показать »

//фукнкция создает процесс с помощью CreateProcess и читает из него данные
//для консольного приложения
CString MyCreateProcess(CString name, CString param)
{
	char buf[1024];           //буфер ввода/вывода



	STARTUPINFO si;
	SECURITY_ATTRIBUTES sa;
	PROCESS_INFORMATION pi;

	HANDLE newstdout,read_stdout;  //дескрипторы
                                                      // пайпов

	sa.lpSecurityDescriptor = NULL;

	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.bInheritHandle = true;       //разрешаем наследование дескрипторов

	if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
													// для stdout
	{
		AfxMessageBox(L"CreatePipe");
		return L"";
	}


	GetStartupInfo(&si);      //создаем startupinfo для
                            // дочернего процесса

	/*

	Параметр dwFlags сообщает функции CreateProcess
	как именно надо создать процесс.

	STARTF_USESTDHANDLES управляет полями hStd*.
	STARTF_USESHOWWINDOW управляет полем wShowWindow.

	*/

	si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	si.hStdOutput = newstdout;
	si.hStdError = newstdout;   //подменяем дескрипторы для

	// char app_spawn[] = L"d:\winnt\system32\cmd.exe"; //это просто
														// пример,
														//замените на то,
														// что вам нужно


  
//	TCHAR szCmdline[]=L"recognition.exe img.png";
//	CString str(L"recognition.exe img.png");
	//создаем дочерний процесс
	if (!CreateProcess(name.GetBuffer(),param.GetBuffer(),NULL,NULL,TRUE,HIGH_PRIORITY_CLASS,
						NULL,NULL,&si,&pi))
	{
		AfxMessageBox(L"CreateProcess");
		CloseHandle(newstdout);
		CloseHandle(read_stdout);
		return L"";
	}



	unsigned long exit=0;  //код завершения процесса
	unsigned long bread;   //кол-во прочитанных байт
	unsigned long avail;   //кол-во доступных байт
	CString result(L"");//результат



	std::fill(buf,buf+1024,0);

	for(;;)      //основной цикл программы
	{
		GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс
                                           // не закрыт
		if (exit != STILL_ACTIVE)
			break;

		PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);

		//Проверяем, есть ли данные для чтения в stdout

		if (bread != 0)
		{
			std::fill(buf,buf+1024,0);
			if (avail > 1023)
			{
				while (bread >= 1023)
				{
					ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
																// пайпа stdout
					CString str;str.Format(L"%S",buf);
				//	AfxMessageBox(str);
					result+=str;
					std::fill(buf,buf+1024,0);
				}
			}
			else
			{
				ReadFile(read_stdout,buf,1023,&bread,NULL);
				CString str;str.Format(L"%S",buf);
			//	AfxMessageBox(str);
				result+=str;
			}
		}
	}

	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);           //небольшая уборка за собой
	CloseHandle(newstdout);
	CloseHandle(read_stdout);

	return result;
}

WebBrowser, функция копирует изображение в буфер из браузера

Показать »

//Функция добавляет изображение в буфер
//принимает
// 1. CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>& pDoc2
// 2. CComQIPtr<IHTMLElement,&IID_IHTMLElement> pImgElement;
BOOL AddImgToBuffer(CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>&pDoc2, CComQIPtr<IHTMLElement,&IID_IHTMLElement>& pImgElement)
{
	IHTMLElement* pelmBody=NULL;//тело документа
	IHTMLElement2* pelmBodyTwo=NULL;//тело документа 2
	IDispatch* pdispCtrlRange=NULL;
	IDispatch* pdispImgElement=NULL;
	IHTMLControlRange* pCtrlRange=NULL;
	IHTMLControlElement* pCtrlElement = NULL;

	// 1. получаем IHTMLElement* pelmBody = NULL;
	if(FAILED(pDoc2->get_body(&pelmBody)) || pelmBody == NULL)
	{AfxMessageBox(L"net pelmBody");return FALSE;}
	// 2. получаем IHTMLElement2* pelmBodyTwo = NULL;
	if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) || pelmBodyTwo == NULL)
	{AfxMessageBox(L"net pelmBodyTwo");return FALSE;}
	// 3. получаем IDispatch* pdispCtrlRange = NULL;
	if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) || pdispCtrlRange == NULL) 
	{AfxMessageBox(L"net pelmBodyTwo");return FALSE;}
	// 4. получаем IHTMLControlRange* pCtrlRange = NULL;
	if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) || pCtrlRange == NULL)
	{AfxMessageBox(L"net pCtrlRange");return FALSE;}
	// 5. получаем IHTMLControlElement* pCtrlElement = NULL;
	if (FAILED(pImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement)) || pCtrlElement == NULL) 
	{AfxMessageBox(L"net pCtrlElement");return FALSE;}
	// 6. добавляем элементв Control
	if(FAILED(pCtrlRange->add(pCtrlElement))){AfxMessageBox(L"not pCtrlRange->add(pCtrlElement)");}
	// 7. выполняем команду (походу коппирует в буфер изображение в браузере)
	VARIANT_BOOL vbReturn;
	VARIANT vEmpty;
	VariantInit(&vEmpty);
	if(FAILED( pCtrlRange->execCommand(L"Copy", VARIANT_FALSE,vEmpty, &vbReturn) ))
	{AfxMessageBox(L"not execCommand");return FALSE;}

	return TRUE;
}

Преобразование из CStringW в char*

Показать »

Почитать за преобразования различных типов можно тут. Функция которая преобразует CStringW в char*

//преобразовывает CStringW в Char
char* CStringW_to_char(CStringW str)
{
    const size_t newsizew = (str.GetLength() + 1)*2;
    char *nstringw = new char[newsizew];
    size_t convertedCharsw = 0;
    wcstombs_s(&convertedCharsw, nstringw, newsizew, str, _TRUNCATE );
    return nstringw;
}

 

 

Parser_fl_ru программка для автоматических ответов под проектами :)

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

Программка для автоматического отсылания сообщения под проектами на сайте fl.ru

Запускаем программуку

Pars_fl_ruв настройках вводим логин пароль и сообщение которое хотите оставить, так же вводим время задержки между запросами, чем больше чем меньше шансов что забанят, вводим с какой страницы начинаем и количество страниц в постраничной >>>Читать далее

MFC Сериализация диалогового приложения Serialize

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

Здорова!

Сегодня разберем как создать сериализацию для диалогового приложения. И так приступим. Создаем диалоговое приложение, в классе диалога перезагружаем функцию Serialize и добавляем в нее код

Ctest_fl_ruDlg::Serialize »

void Ctest_fl_ruDlg::Serialize(CArchive& ar)
{
	AfxMessageBox(L"Serialize");
	TRACE("Serializen");
	CDialogEx::Serialize(ar);//вызываем функцию предка
	if (ar.IsStoring())
	{	// storing code
		ar <<m_cLogin<<m_cPass;
	}
	else
	{	// loading code
		TRACE("Loading coden");
		ar >>m_cLogin>>m_cPass;
	}
}
Нужно вроде обязательно вызвать функцию для базового класса CDialogEx::Serialize

Дальше нужно добавить в определение класса макрос

DECLARE_SERIAL(Ctest_fl_ruDlg)

и в файл с определениями функций класса

IMPLEMENT_SERIAL(Ctest_fl_ruDlg,CDialogEx,1)

Если мы сейчас скомпилируем приложение то функция сериализации вызываться не будет, нам нужно добавить в конструктор ее вызов и в деструктор класса. Ну я так сделал. Вот код конструктора >>>Читать далее

MFC DECLARE_EVENTSINK_MAP отлов событий в WebBrowser

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

Здорова! Сегодня разберем такой макрос как DECLARE_EVENTSINK_MAP. В WebBrowser существуют события DWebBrowserEvents2, почитать за этот интерфейс можно тут.  За DECLARE_EVENTSINK_MAP читаем тут.

Приступим к реализации отлова событий. Создаем приложение MFC на основе диалоговых окон, подключаем и WebBrowser, вообще директиву #import можно не использовать, WebBrowser походу уже подключен по умлочанию имеются интерфейсы, потому что когда мы подключаем с помощью #import у нас происходит конфликт имен и нужно обязательно определять пространство имен для #import. Нам нужно только подключать файл для работы с DOM файл mshtml.h . В общем добавили WebBrowser и у вас получилось такое окошко

WebBrowserЭто я загрузил страницу microsoft.com по нажатию на кнопку “start”, вот код обработчика кнопки старт >>>Читать далее

MFC Программирование многопоточного приложения

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

Здорова! Сегодня разберем как создаются многопоточные приложения. Про то как создаются однопоточные приложения мы уже разобрали тут.

Немножко теории и терминов

Процесс (process) – это выполняемая программа, обладающая собственной памятью, описателями файлов и другими системными ресурсами. Процесс может допускать несколько параллельных путей исполнения кода, называемых потоками (threads).

Потоки в Windows бывают двух видов: рабочие потоки (worder threads) и потоки пользовательского интерфейса (user-interface threads). MFC – библиотека поддерживает оба вида. У потоков пользовательского интерфейса есть она, а значит и свой цикл выборки сообщений, а у рабочего нет. Рабочие потоки легче программировать и они как правило полезнее.

Не забывайте что даже в однопоточном приложении есть поток, который называется основным потоком (main thread).
>>>Читать далее

MFC Обработка сообщений Windows в однопоточной программе

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

Здорова! Немножко разберемся как обрабатывает сообщения Windows в однопоточной программе и создадим эту программку тестовую. В каждой программе виндовс спрятаны следующие инструкции

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

Это бесконечный цикл из которого никогда не будет выхода, потому что если нету сообщений функция GetMessage ждет пока они появятся, про нее вы можете почитать тут. Windows определяет, какие сообщения принадлежат вашей программе, а функция GetMessage возвращает управление, как только появляется сообщение для обработки. Если сообщений нет, то программа приостанавливается, и выполняются другие приложения. Когда сообщения поступают, то ваша программа “пробуждается”. >>>Читать далее

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; >>>Читать далее