Einzelnen Beitrag anzeigen

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, 12: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