Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi funktioniert diese funktion unter Windows ME nicht? (https://www.delphipraxis.net/44656-funktioniert-diese-funktion-unter-windows-me-nicht.html)

resolution 22. Apr 2005 11:08


funktioniert diese funktion unter Windows ME nicht?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, habe schnell eine art network-scan geschrieben, der unser lokales netz nach rechnern mit freigaben durchsucht und diese anzeigt, unter 2000/XP gibt es keine probleme, unter ME scheint sich der Rechner aufzuhängen, wieso ? ;)

aufruf der funktion z.b.:
Delphi-Quellcode:
 try
  errors:=TStringList.Create;
  nextstep:=false;
  if GetConsole('cmd /c NBTSTAT -A '+F.nblist.Lines.Strings[k],output,errors)
  then F.memoout.Lines.AddStrings(output)
  else nextstep:=true;
 finally
  output.free;
  errors.free;
 end;
(F.nblist.Lines.Strings sind die IP's der Rechner, die auf einen vorherigen Ping reagiert haben..)


und das ist die funktion (weiss nichtmehr wo ich die gefunden habe :( )
// edit: doch, von hier: http://www.dsdt.info/tipps/?id=637
Delphi-Quellcode:
function GetConsole(const Command: String; var Output, Errors: TStringList): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;
ich kann das leider nicht wirklich gut debuggen, da nur ne bekannte WinME hat und ich nit..
unter 2k/XP wie gesagt alles problemlos..

NicoDE 22. Apr 2005 11:50

Re: funktioniert diese funktion unter Windows ME nicht?
 
Die Ursache könnte eine Endlosschleife durch
Zitat:

succeed := ReadFile(...);
if not succeed then
break;
sein (ReadFile gibt unter Win9x gerne True zurück, obwohl der Prozeß schon beendet ist...).

BTW, cmd.exe gibt es unter Win9x nicht, dort heißt der Standard-Kommandzeileninterpreter command.com (aber bevor Du anfängst es hart zu kodieren, liess die Umgebungsvariable %ComSpec% aus!).

Muetze1 22. Apr 2005 11:57

Re: funktioniert diese funktion unter Windows ME nicht?
 
Moin!

Und wieso überhaupt über diesen Umweg und nicht einfach direkt Windows fragen? Siehe dazu mal hier...

MfG
Muetze1

resolution 22. Apr 2005 14:19

Re: funktioniert diese funktion unter Windows ME nicht?
 
danke :)
ich lasse jetzt den cli abgefragen.. ist mir als ich kurz an dem rechner saß zwar aufgefallen, aber hab da nicht an mein programm gedacht :)

das problem besteht jedenfalls immernoch, also müsste ich das mit der 'endlosschleife' testen.. aber wie umgehe ich das?


@Muetze:
das Problem ist, dass windows ne anfrage an den masterbrowser sendet, der ist aber fast immer firewalled und deswegen bekommt man so in unserem netz wenn überhaupt nur sehr wenige rechner zu sehen, deswegen die brechstange.. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz