får jeg at vide, at handleren er ugyldig (Fejlkode 6).
Her er den procedure, der bliver kaldt:
function Screen(ConsoleOutput: THandle; const X, Y, Length: DWORD): String; var ReadCoord: TCoord; NumberOfCharsRead: DWORD; begin ReadCoord.X := X; ReadCoord.Y := Y; SetLength(Result, Length); if not ReadConsoleOutputCharacter(ConsoleOutput, PChar(Result), Length, ReadCoord, NumberOfCharsRead) then RaiseLastWin32Error; SetLength(Result, NumberOfCharsRead); end;
Er der én der kan finde en løsning eller har en anden måde at læse indholdet fra et dosvindue, medens dos-programmet kører? Pipning af output til en tekst-fil kan ikke bruges, da programmet først skriver til filen, når det bliver lukket.
AI bliver først for alvor en del af arbejdet, når teknologien integreres i den måde, vi arbejder på. At have adgang til AI betyder ikke nødvendigvis, at medarbejderne er klar til at bruge den.
Når jeg afvikler koden fra spm 72187 på Win98 og DOS-programmet venter på et input, låser Delphi-programmet hele maskinen.
Jeg har fundet nedenstående kode på nettet. Dette program virker både under Win98 og WinNT. Jeg har selv forsøgt at sende tekst til DOS-programmet, men kan ikke finde ud af at få emuleret et tryk på RETURN-tasten.
Hvis én kan løse det problem, så er der stadig point at hente.
var Form1 : TForm1; hConsole : THandle; ProcessInfo : TProcessInformation;
implementation
{$R *.DFM}
// uses Console;
type cInfo = array[1..MAXINT div SizeOf(TCharInfo)] of TCharInfo; pcInfo = ^cInfo;
procedure TForm1.btnStartClick(Sender: TObject); var zAppName:array[0..512] of char; zCurDir:array[0..255] of char; WorkDir:String; StartupInfo:TStartupInfo; begin btnStart.Enabled := false; if AllocConsole then begin StrPCopy(zAppName,\'command.com /c dir\'); WorkDir := \'c:\\\'; StrPCopy(zCurDir,WorkDir); FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb := Sizeof(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOWDEFAULT; if CreateProcess(nil, zAppName, // pointer to command line string nil, // pointer to process security attributes nil, // pointer to thread security attributes false, // handle inheritance flag CREATE_SEPARATE_WOW_VDM or // creation flags NORMAL_PRIORITY_CLASS, nil, // pointer to new environment block nil, // pointer to current directory name StartupInfo, // pointer to STARTUPINFO ProcessInfo) then // pointer to PROCESS_INF begin SetConsoleTitle(PChar(\'Test Console Application\')); hConsole := GetStdHandle(STD_OUTPUT_HANDLE); btnStop.Enabled := true; btnGrab.Enabled := true; btnWrite.Enabled := true; end else begin btnStart.Enabled := true; end; end; end;
procedure TForm1.btnStopClick(Sender: TObject); var ProcessResult : dword; //integer; begin try WaitforSingleObject(ProcessInfo.hProcess,INFINITE); //wait for DOS process GetExitCodeProcess(ProcessInfo.hProcess,ProcessResult); CloseHandle( ProcessInfo.hProcess ); CloseHandle( ProcessInfo.hThread ); CloseHandle(hConsole); FreeConsole; btnStop.Enabled := false; btnGrab.Enabled := false; btnWrite.Enabled := false; btnStart.Enabled := true; except end; end;
procedure TForm1.btnGrabClick(Sender: TObject); var hConOut : THandle; Dest : TCoord; csbi : TConsoleScreenBufferInfo; // used to get screen size i, j : integer; s : string; GrabBuff : pcInfo; begin btnGrab.Enabled := false; Dest.X := 0; Dest.Y := 0; try hConOut := GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hConOut, csbi); SetLength(s, csbi.dwMaximumWindowSize.X + 1); GetMem(GrabBuff, csbi.dwMaximumWindowSize.X * csbi.dwMaximumWindowSize.Y * sizeof(TCharInfo)); try // read the screen rectangle into the buffer ReadConsoleOutput(hConOut, // output buffer GrabBuff, // buffer that receives data csbi.dwMaximumWindowSize, // col/row size of destination buffer Dest, // upper-left cell to write data to csbi.srWindow); // screen buffer rectangle to read from //copy text data from pCharInfo to memo Memo1.Clear; for i := 0 to csbi.dwMaximumWindowSize.Y - 1 do begin s := \'\'; for j := 1 to csbi.dwMaximumWindowSize.X do s := s + GrabBuff^[i*csbi.dwMaximumWindowSize.X + j].AsciiChar; Memo1.Lines.Add(s); end; finally freemem(GrabBuff); end; finally btnGrab.Enabled := true; end; end;
procedure TForm1.btnWriteClick(Sender: TObject); begin writeln(\'Y\'+chr(13)); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.