Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2012, 16:30   #1
maleziv
Пользователь
 
Регистрация: 27.07.2012
Сообщений: 12
По умолчанию Проблема совместимости Win XP и Win 2000 при взаимодействии с консолью.

Доброго времени суток.
Существует проблема: необходимо связаться с консолью по ее идентификатору. Затем необходимо по очереди передать в консоль команды и получить результат выполнения этих команды в текстовый файл.

В коде снизу я захватываю консоль по ее идентификатору и в цикле передаю команду dir (экспериментирую на cmd ), выполнение команды отображается в консоли, затем результат выполнения записываю в файл. Но появилась проблема совместимости: на Win XP работает как часы, а вот на Win 2000 спотыкается на этой строчке AttachConsole(mProcessID).
Необходимо реализовать для Win 2000.

P.S: Консоль (стороннего производителя, а не cmd и подобных ) всегда запущена, запускать программным путем ее не нужно: CreateProcess (nil,PChar(CmdLine),@Security,@Secu rity,true,NORMAL_PRIORITY_CLASS,nil ,nil,start,ProcessInfo) – использование отпадает, так как ее запускают (delphiworld.narod.ru/base/console_to_memo.html).
Я так думаю нужно, как то совместить технологию Pipe и поиска идентификатора консоли. В инсети такой реализации не нашел.
Пожалуйста, подскажите, как это сделать?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
   const
   _WIN32_WINNT = $0501;
type
TAttachConsole = function (dwProcessId: DWORD): LongBOOL stdcall;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  AttachConsole: TAttachConsole;
  mProcessID, Wnd, Hcwnd, chRead: Cardinal;
  BufInfo: _CONSOLE_SCREEN_BUFFER_INFO;
  lpCh: PChar;
  Coord: _COORD;
  i: Integer;
  p:string;
   s, ss: string;
implementation

{$R *.dfm}
function OpenFile(var fLog: TextFile; const LogFileName: String;
   const IsErase: Boolean = False): Boolean;
var
   TmpStr: String;
begin

   AssignFile(fLog, LogFileName);
   Result := IOResult = 0;
   if Result then begin
      if IsErase or (not FileExists (LogFileName)) then
         Rewrite(fLog)
      else
         Append(fLog);
      Result := IOResult = 0;
   end;

end;

function WriteLnStr(const fLog: TextFile; const fStr: string): boolean;

begin
{$I-}
   Writeln (fLog, fStr);
   Result := IOResult = 0;
   if Result then begin
         // { Flush(fLog); }
        Flush(System.Input); // {System.Output}
      Result := IOResult = 0;
   end;
{$I+}
end;

procedure CloseFile(var fLog: TextFile);
begin

  Flush(fLog);
  System.CloseFile(fLog);

end;


function StrFile(const fStr, fFileName: String;
   const IsErase: Boolean = False): Boolean;
var
   fLog: TextFile;
begin
   Result := OpenFile(fLog, fFileName, IsErase);
   if Result then begin
      try
         Result := WriteLnStr(fLog, fStr);
      finally
         CloseFile(fLog);
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
@AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole');

 Wnd := FindWindow(nil, 'Command Prompt'); 

  GetWindowThreadProcessId(Wnd, @mProcessID);
 // получаем по хэндлу окна ИД процесса, чтобы прицепиться к консоли

if Wnd <> 0 then
   begin
     s := 'dir';
     for i := 1 to Length(s) do
     begin
       SendMessage(Wnd, WM_CHAR, Word(s[i]), 0);
    
        end;
   
    PostMessage(Wnd, WM_KEYDOWN, VK_RETURN, 0);
     sleep(1000);
   end;



if Wnd <> 0 then
   begin
     s := 'dir';
     for i := 1 to Length(s) do
     begin
       SendMessage(Wnd, WM_CHAR, Word(s[i]), 0);
      //  sleep(100);
        end;
     // Simulate Return Key.
    PostMessage(Wnd, WM_KEYDOWN, VK_RETURN, 0);
     sleep(100);
   end;

 if AttachConsole(mProcessID) then begin 
    Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);  
    GetConsoleScreenBufferInfo (Hcwnd, BufInfo); 
   GetMem(lpCh, (BufInfo.dwMaximumWindowSize.Y*BufInfo.dwMaximumWindowSize.X));
//Процедура GetMem пытается получить указанные в BufInfo.dwMaximumWindowSize.Y*BufInfo.dwMaximumWindowSize.X байт памяти
      try
      for i:=0 to BufInfo.dwMaximumWindowSize.Y+100 do begin
         Coord.X := 0;
         Coord.Y := i;
         ReadConsoleOutputCharacter(Hcwnd, lpCh, BufInfo.dwMaximumWindowSize.X, Coord, chRead);

         StrFile(lpCh, ChangeFileExt('C:\1', '.txt'), False); 
      end;
    finally
     FreeMem(lpCh, BufInfo.dwMaximumWindowSize.Y*BufInfo.dwMaximumWindowSize.X);
    end;
  end;
 end;
end.

Последний раз редактировалось Stilet; 27.07.2012 в 20:09. Причина: ошибка в коде
maleziv вне форума Ответить с цитированием
Старый 27.07.2012, 17:12   #2
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Requirements

Minimum supported client
Windows XP

Minimum supported server
Windows Server 2003
xoodoo вне форума Ответить с цитированием
Старый 27.07.2012, 17:25   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Функция AttachConsole не существует в Windows 2000.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 27.07.2012, 17:27   #4
maleziv
Пользователь
 
Регистрация: 27.07.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Requirements

Minimum supported client
Windows XP

Minimum supported server
Windows Server 2003
Вы на библиотеку Kernel32.dll намекаете? В Win 2000 она присутствует.
Подменить ее на более современную не представляется возможным. Такое вот условие...
maleziv вне форума Ответить с цитированием
Старый 27.07.2012, 17:30   #5
maleziv
Пользователь
 
Регистрация: 27.07.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Функция AttachConsole не существует в Windows 2000.
Я это и говорю, нужно как то вывернуться осуществить поиск по хендлу уже запущенной консоли и перенаправить вывод в файл.
maleziv вне форума Ответить с цитированием
Старый 27.07.2012, 18:12   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Внедрение в процесс + IPC + DuplicateHandle.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 27.07.2012, 18:53   #7
maleziv
Пользователь
 
Регистрация: 27.07.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Внедрение в процесс + IPC + DuplicateHandle.
уважаемый можно примерчик
maleziv вне форума Ответить с цитированием
Старый 27.07.2012, 21:02   #8
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

> на библиотеку Kernel32.dll намекаете?

Я ни на что не намекаю.
Есть официальный первоисточник - в нем черным по белому написаны требования.

> В Win 2000 она присутствует.

Да неужели ? А я и не знал.
xoodoo вне форума Ответить с цитированием
Старый 01.08.2012, 22:31   #9
maleziv
Пользователь
 
Регистрация: 27.07.2012
Сообщений: 12
Вопрос

Лучше дайте дельный совет, как решить данную проблему, в инете тема не раскрыта.
maleziv вне форума Ответить с цитированием
Старый 02.08.2012, 13:54   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Совет дали. Писать код за тебя - увольте.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
висне сет при запуску Win XP после установки Win 7 VVkSoft Windows 3 15.09.2009 10:36
Проблема при установке 2 win Bandit71 Компьютерное железо 5 15.06.2008 21:13
пути в реестре, где находятся программы автозагрузки для win'95 win'98 win' me win 2000 Prisian Win Api 1 11.09.2007 20:07
ветви в реестре для автозагрузки для win'95, win'98, win' me, win 2000 Prisian Windows 1 09.09.2007 23:15