AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi funktioniert diese funktion unter Windows ME nicht?
Thema durchsuchen
Ansicht
Themen-Optionen

funktioniert diese funktion unter Windows ME nicht?

Ein Thema von resolution · begonnen am 22. Apr 2005 · letzter Beitrag vom 22. Apr 2005
Antwort Antwort
Benutzerbild von resolution
resolution

Registriert seit: 4. Jan 2005
Ort: Saarbrücken
52 Beiträge
 
Delphi 7 Enterprise
 
#1

funktioniert diese funktion unter Windows ME nicht?

  Alt 22. Apr 2005, 11:08
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..
Angehängte Dateien
Dateityp: zip netscan_198.zip (12,0 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: funktioniert diese funktion unter Windows ME nicht?

  Alt 22. Apr 2005, 11:50
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!).
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: funktioniert diese funktion unter Windows ME nicht?

  Alt 22. Apr 2005, 11:57
Moin!

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

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von resolution
resolution

Registriert seit: 4. Jan 2005
Ort: Saarbrücken
52 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: funktioniert diese funktion unter Windows ME nicht?

  Alt 22. Apr 2005, 14:19
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..
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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