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

Рубрика: MFC, Дата: 31 August, 2015, Автор:

Функция создает процесс 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;
}

 

 

rss