Функция создает процесс CreateProcess и перенаправляет вывод
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
//фукнкция создает процесс с помощью 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
//Функция добавляет изображение в буфер //принимает // 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*
1 2 3 4 5 6 7 8 9 |
//преобразовывает 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; } |