ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Возможность работы приложения и в оконном, и в консольном режиме
  #1  
Старый 25.05.2007, 12:48
Аватар для Joker-jar
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию Возможность работы приложения и в оконном, и в консольном режиме

Вы когда-нибудь думали о том, чтоб создать приложение, которое могло быть и оконным, и консольным? Например, при обычном запуске (кликом и т.д.) программа работала в оконном режиме, но если в консоли выполнить имя_программы.exe mode:console, программа смогла бы работать в режиме консоли. Я попытался реализовать это на Delphi.

В общем, если есть параметры приложению, то оно пытаеться найти родительский процесс и атачится к его консоли. Если нет атача, то завершается. После удачного атача, прога делает clrscr() и останавливает все потоки в родительском процессе (потому что ее вывод/ввод до сих пор работает). И все.

Есть некоторый баг,понять и исправить который я не смог. Самый первый вызов Readln (неважно, я все перепробовал - ReadFile,ReadConsole,ReadConsoleInput) просит две строки. Т.е. если написать "string1\r\n", то read\readln не прочитает ее, надо снова ее набрать. Больше багов вроде нет.

Код:
const
  ATTACH_PARENT_PROCESS=$FFFFFFFF;
  THREAD_SUSPEND_RESUME=$2;

var hConsWrite:THandle;
    ParentPid :dword;

function AttachConsole(dwProcessId: dword):BOOL; stdcall; external kernel32 name 'AttachConsole';
function OpenThread(dwFlags:dword; Inhirr:BOOL; ThreadId:dword):dword; stdcall; external kernel32 name 'OpenThread';

procedure SuspendCmd;
var hProc     :TProcessEntry32;
    hThreads  :TThreadEntry32;
    Snap      :THandle;
    hThread   :THandle;
begin
ParentPid:=0;
Snap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (Snap=INVALID_HANDLE_VALUE) then exit;
hProc.dwSize:=SizeOf(hProc);
Process32First(Snap,hProc);
repeat
  if (hProc.th32ProcessID=GetCurrentProcessId) then
    begin ParentPid:=hProc.th32ParentProcessID; break; end;
until not Process32Next(Snap,hProc);
if (ParentPid=0) then Exit;
CloseHandle(Snap);
hThreads.dwSize:=SizeOf(hThreads);
Snap:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD,0);
Thread32First(Snap,hThreads);
repeat
  if (hThreads.th32OwnerProcessID<>ParentPid) then continue;//only in Parent
  hThread:=OpenThread(THREAD_SUSPEND_RESUME,false,hThreads.th32ThreadID);
  if (hThread=INVALID_HANDLE_VALUE) then exit;
  SuspendThread(hThread);
  CloseHandle(hThread);
until not Thread32Next(Snap,hThreads);
CloseHandle(Snap);
end;

procedure ClrScr;
var fill:Cardinal;
    ScrBufInfo: TConsoleScreenBufferInfo;
    UpperLeft: TCoord;
begin
UpperLeft.X:=0; UpperLeft.Y:=0;
GetConsoleScreenBufferInfo(hConsWrite, ScrBufInfo);
fill:=ScrBufInfo.dwSize.x*ScrBufInfo.dwSize.y;
FillConsoleOutputCharacter(hConsWrite,' ',fill,UpperLeft,fill);
FillConsoleOutputAttribute(hConsWrite,ScrBufInfo.wAttributes,fill,UpperLeft,fill);
SetConsoleCursorPosition(hConsWrite,UpperLeft);
end;

procedure ProgramWindow;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
ExitProcess(0);
end;

var buff:array[0..100]of char;
begin
if ParamCount=0 then ProgramWindow;
// else Console working...
if not AttachConsole(ATTACH_PARENT_PROCESS) then exit
  else SuspendCmd;
hConsWrite:=GetStdHandle(STD_OUTPUT_HANDLE);
ClrScr;
Writeln('For start press Enter...(for quit press "exit")');
Readln(buff); // вот этот реадлн, требует  2-e <Enter>
while true do
  begin
  FillChar(buff,SizeOf(buff),0);
  Writeln('Enter any keys:');
  Readln(buff);
  if lstrcmp(buff,'exit')=0 then break;
  Writeln('You writen this:',buff);
  end;
TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,ParentPID),0);
end.
Зависимость - TlHelp32
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват Gsm пакетов SNIFF Сотовый фрикинг 16 27.12.2009 22:25
Программы для работы с железом. Часть 2 – материнские платы _GaLs_ Аппаратное обеспечение 0 19.11.2006 12:57
секреты и коды для сотовых телефонов ))) dinar_007 Сотовый фрикинг 32 05.08.2006 17:06
Как «растянуть» аккумулятор novichok Сотовый фрикинг 4 28.02.2006 22:47
Возможность захвата сайта с Powered by UPB Version : 1.95. Егорыч+++ Уязвимости 1 10.01.2005 23:59



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ