Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с чтением из пайпа, pipe readfile 
:(
    Опции темы
Bugmaker
Дата 6.11.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Есть код:

Код

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>

using namespace std;
int main()
{
    
  char buf[1024];           //áóôåð ââîäà/âûâîäà
  STARTUPINFO si;
  SECURITY_ATTRIBUTES sa;
  SECURITY_DESCRIPTOR sd;        //ñòðóêòóðà security äëÿ ïàéïîâ (3 ïàðàìåòð ôóíêöèè createpipe)
  PROCESS_INFORMATION pi;
     InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
     SetSecurityDescriptorDacl(&sd, true, NULL, false);
     sa.lpSecurityDescriptor = &sd;
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
     sa.bInheritHandle = true;
  
  HANDLE htargetStdIn, hMyStdin;
  
  htargetStdIn = FindWindow(NULL, "Untitled - Notepad");  
  cout << htargetStdIn<<endl;
 
  
                         if (!CreatePipe(&htargetStdIn,&hMyStdin,&sa,0))                
                        {
                        cout << "ERROR CreatePipe"<<GetLastError();
                        system ("pause");
                        return -1;
                        }
  unsigned long bread;
  for(int i=0;i<20;i++)
{
          cout << i;
ReadFile(htargetStdIn,&buf[0],10,&bread,NULL);  //÷èòàåì èç ïàéïà stdout
for(int j=0;j<20;j++) cout << buf[j]<<i;
Sleep (500);
}
    
    system ("pause");
    return 0;
}    




Просто, пытаюсь из уже запущенного блокнота читать данные через pipe.
Ничего не выходит.
Подскажите, в чем ошибка.

И еще вопрос чем HWND отличается от Handle ? 
PM MAIL   Вверх
leniviy
Дата 6.11.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



У блокнота нет stdin. Код - беспорядочное нагромождение. Цель не ясна. HWND - особый тип HANDLE, его нельзя использовать в ReadFile/WriteFile

Это сообщение отредактировал(а) leniviy - 6.11.2010, 12:42
PM MAIL   Вверх
Bugmaker
Дата 6.11.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Я же написал:
"Просто, пытаюсь из уже запущенного блокнота читать данные через pipe."


Если заменить 

htargetStdIn = FindWindow(NULL, "Untitled - Notepad");  
на 
  htargetStdIn = FindWindow(NULL, "C:\\WINDOWS\\system32\\cmd.exe");

и запустить командную строку, - эффетк такой же. вернее никакой.



PM MAIL   Вверх
leniviy
Дата 6.11.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(Bugmaker @  6.11.2010,  12:56 Найти цитируемый пост)
"Просто, пытаюсь из уже запущенного блокнота читать данные через pipe."

Ладно, что за данные? Хочешь узнать, что печатает на клавиатуре пользователь блокнота?
PM MAIL   Вверх
Bugmaker
Дата 6.11.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Вообще хочу перенаправить вво-вывод с cmd в свое консольное приложение.
блокнот взял просто потому что думал на блокноте нагляднее и безопасьнее...

Нужно именно через pipe.
Я понимаю что есть другие методы... например winapi GetKeyState и т.д..
PM MAIL   Вверх
leniviy
Дата 6.11.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



1) Блокнот - плохой выбор. Только в консольных прогах можно перенаправить ввод/вывод.
2) Нельзя  перенаправить ввод/вывод уже запущенной программы. Пайпы надо передавать через CreateProcess. Пример есть в msdn.
http://msdn.microsoft.com/en-us/library/ms...v=VS.85%29.aspx

Это сообщение отредактировал(а) leniviy - 6.11.2010, 13:15
PM MAIL   Вверх
Bugmaker
Дата 6.11.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



leniviy, спасибо.
Примеры видел, разбирал... на слова"Нельзя  перенаправить ввод/вывод уже запущенной программы. " нигде не наткнулся, думал можно из любого.
Попробую.

PM MAIL   Вверх
Bugmaker
Дата 8.11.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Кто знает, подскажите, пожалуйста.

Код по данной ссылке http://www.realcoding.net/article/view/815  плодить процессы cmd.exe со свойсвом SH_HIDE.
Строки:

Код

  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(newstdin);            
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);


Не вызывают закрытия процесса.
Нагуглил, что процесс, вызванный CreateProcess() завершается, когда закрываются все хендлы, потоки вызванные им.
Вопрос: Почему остаются невидимые экземпляры cmd.exe ?
PM MAIL   Вверх
xvr
Дата 8.11.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Bugmaker @  8.11.2010,  11:22 Найти цитируемый пост)
Нагуглил, что процесс, вызванный CreateProcess() завершается, когда закрываются все хендлы, потоки вызванные им.
Ключевое слово им, т.е. не вами. Пачкой CloseHandle вы закрываете свои хэндлы, которые использовались при создании процесса. Но у уже созданного процесса есть его хэндлы, которые остаются.
Кроме того, для завершения процесса thread'ы должны завершиться, а не просто закрыться хэндлы на них.



Это сообщение отредактировал(а) xvr - 8.11.2010, 13:27
PM MAIL   Вверх
Bugmaker
Дата 8.11.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



то есть надо найти хендл дочернего приложения изакрыть его пеерд закрытием остальных*?
Эту структуру нельзя заменить чем-нибудь более коротким? например ExitProcess?
PM MAIL   Вверх
xvr
Дата 8.11.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Bugmaker @ 8.11.2010,  13:33)
то есть надо найти хендл дочернего приложения изакрыть его пеерд закрытием остальных*?

Это не поможет. Закрытие хэндла процесса не завершит процесс
Цитата

Эту структуру нельзя заменить чем-нибудь более коротким? например ExitProcess?
Нужно. ExitProcess завершит процесс, сколько бы открытых хэндлов на него не существовало

PM MAIL   Вверх
Bugmaker
Дата 8.11.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



А как выполнить ExitProcess в контексте дочернего приложения???

В MSDN
VOID ExitProcess(
  UINT uExitCode
);

Parameters
uExitCode
[in] Specifies the exit code for the process and for all threads that are terminated as a result of this call. 

To retrieve the process's exit value, use the GetExitCodeProcess function. 

To retrieve a thread's exit value, use the GetExitCodeThread function.

то есть надо
BOOL WINAPI GetExitCodeProcess( хендл дочернего приложения, а вот тут указатель на переменную, котоаря примет эксидкод);  ?? Так будет парвильно?


PM MAIL   Вверх
leniviy
Дата 8.11.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Чтобы закрыть cmd.exe, надо послать команду "exit\n"  и процесс завершится.

Это сообщение отредактировал(а) leniviy - 8.11.2010, 14:48
PM MAIL   Вверх
Bugmaker
Дата 8.11.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



leniviy проявил смекалку)) я и забыл об этом... н овсе же по поводу ExitProcess я правильно мыслю?
PM MAIL   Вверх
leniviy
Дата 8.11.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



TerminateProcess(). А вообще cmd.exe должно завершаться и после закрытия пайпа. 
CloseHandle(write_stdout); должен помочь


Это сообщение отредактировал(а) leniviy - 8.11.2010, 14:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.