Delphi-PRAXiS
Seite 7 von 10   « Erste     567 89     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   MyPC (SystemInfo Programm) (https://www.delphipraxis.net/79288-mypc-systeminfo-programm.html)

Mazel 20. Nov 2006 14:46

Re: MyPC (SystemInfo Programm)
 
Hallo,

ich weis leider nicht warum diese Fehler auftauchen bei der Programmliste und Verzeichnisliste. Ich frage voher ab, ob das Programm oder das Verzeichnis existiert, über FileExists oder DirectoryExists, nur wenn vorhanden, auflisten. Die Programme habe ich in einem Array und die Verzeichnisse lese ich über SHGetSpecialFolderLocation aus. Da muss der Fehler stecken:
Delphi-Quellcode:
{--[GetSpecialDir]-------------------------------------------------------------}
const
// als Beispiel ein paar Systemverzeichnisse

 CSIDL_COMMON_APPDATA = $0023;
 CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
 CSIDL_COMMON_DOCUMENTS = $002E;
 CSIDL_COMMON_FAVORITES = $001F;

function GetSpecialDir(CSIDL: Integer): String;
var
 PIDL          : PItemIDList;
 Path          : PChar;

begin
 SHGetSpecialFolderLocation(Main.Handle, CSIDL, PIDL);
 GetMem(Path, MAX_PATH);
 SHGetPathFromIDList(PIDL, Path);
 Result := Path;
 FreeMem(Path);
end;

// hier das Anzeigen
for i := 0 to 34 do
 begin
  If DirectoryExists(GetSpecialDir(SYSTEM_CSIDL_DIRS[i])) then
   begin
    Item := Main.LVwInfos.Items.Add;
    Item.Caption := SYSTEM_STRING_DIRS[i];
    Item.SubItems.Add(GetSpecialDir(SYSTEM_CSIDL_DIRS[i]));
   end;
 end;
Bei mein Vaters Rechner kommt der Fehler beim Autostartverzeichniss aber warum, weis ich nicht.

Nun zum registriert sein oder nicht registriert sein. ;)
Diesen Wert lese ich aus der Registry aus. Dort scheint zu stehen, dass Windows registriert ist.
Delphi-Quellcode:
HKLM\SOFTWARE\Microsoft\Windows( NT)\CurrentVersion\';
und den Wert von RegDone.
Ich prüfe ob der Wert von RegDone = '' oder nicht, wenn es so ist, dann ist es nicht registriert sonst ist es registiert.

Zu den Icons: ja, leider Fehlen bei manchen die Pfad, ähnlich auch bei den Dateitypen, da muss ich noch die Anführungstriche und andere Zeichen entfernen um den genauen Pfad zu ermitteln.
Zitat:

Ich habe ein DualMon System, also habe ich 2 Monitore mit zwei Auflösungen. Dies wird bisher noch nicht berücksichtigt. Willst du einen Code haben um die Grafikkartennamen (vom Treiber) und den Monitornamen zu bekommen an den Ausgängen?
Leider konnte ich in der Zeit nicht alles schaffen, aber ein Code der mir helfne könnte, kannst du mir durchaus geben. Wär schön.

Gruß
Mazel

Muetze1 20. Nov 2006 17:46

Re: MyPC (SystemInfo Programm)
 
Ok, kurzer Code dazu:

Delphi-Quellcode:
Procedure TForm1.FillMonitorList;
Var
  Cntr       : Cardinal;
  Info       : TDisplayDevice;
  AdapterName : PChar;
  OldPos     : Integer;
Const
  DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = $00000001;
  DISPLAY_DEVICE_MULTI_DRIVER       = $00000002;
  DISPLAY_DEVICE_PRIMARY_DEVICE     = $00000004;
  DISPLAY_DEVICE_MIRRORING_DRIVER   = $00000008;
  DISPLAY_DEVICE_VGA                = $00000010;
Begin
  lbMonitorList.Items.Add('------------------ Displays ----------------');

  Cntr := 0;
  Info.cb := SizeOf(Info);
  While EnumDisplayDevices(Nil, Cntr, Info, 0) Do
  Begin
    lbMonitorList.Items.Add('* Device '+IntToStr(Cntr)+':');
    lbMonitorList.Items.Add('   DeviceName : '+Info.DeviceName);
    lbMonitorList.Items.Add('   DeviceString: '+Info.DeviceString);

    OldPos := lbMonitorList.Items.Add('   StateFlags:  ');

    If ( Info.StateFlags And DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ) = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Then
      lbMonitorList.Items.Add('     + Display Device Attached To Desktop')
    Else
      lbMonitorList.Items.Add('     - Display Device Attached To Desktop');

    If ( Info.StateFlags And DISPLAY_DEVICE_MULTI_DRIVER ) = DISPLAY_DEVICE_MULTI_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Multi Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Multi Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_PRIMARY_DEVICE ) = DISPLAY_DEVICE_PRIMARY_DEVICE Then
      lbMonitorList.Items.Add('     + Display Device Primary Device')
    Else
      lbMonitorList.Items.Add('     - Display Device Primary Device');

    If ( Info.StateFlags And DISPLAY_DEVICE_MIRRORING_DRIVER ) = DISPLAY_DEVICE_MIRRORING_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Mirroring Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Mirroring Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_VGA ) = DISPLAY_DEVICE_VGA Then
      lbMonitorList.Items.Add('     + Display Device VGA')
    Else
      lbMonitorList.Items.Add('     - Display Device VGA');


    AdapterName := StrAlloc(SizeOf(Info.DeviceName));
    Try
      StrCopy(AdapterName, Info.DeviceName);
      EnumDisplayDevices(AdapterName, 0, Info, 0);
      lbMonitorList.Items.Insert(OldPos, '   Monitorname : ' + Info.DeviceString);
    Finally
      StrDispose(AdapterName);
    End;

    Inc(Cntr);
  End;
End;
lbMonitorList = TListBox

Und man möge mir verzeihen, aber es ist ein alter Code. Dadurch stehen dort noch Dinge wie StrAlloc() und StrDispose(). Das könntest du bei dir gleich abändern...

Martin K 23. Nov 2006 20:21

Re: MyPC (SystemInfo Programm)
 
Zu Deinem Code oben, zum Auslesen der Ordnerverzeichnisse:
Ich glaube das liegt daran, dass Path als Result zurückgegeben wird und danach freigegeben wird.
Evtl. könnten dadurch Exceptions entstehen.

Hier mal, wie ich es gemacht habe:
Delphi-Quellcode:
function GetShellPath(const CSIDL: Byte): String;
var pidl: PItemIdList; Malloc: IMalloc;
begin
  if (SHGetMalloc(Malloc)=S_OK) and SUCCEEDED(SHGetSpecialFolderLocation(0,CSIDL,pidl)) then
  try
    SetLength(Result,MAX_PATH+1);
    if SHGetPathFromIDList(pidl,PChar(Result)) and (PChar(Result)<>'') then
      Result:=IncludeTrailingPathDelimiter(PChar(Result))
    else
      Result:='';
  finally
    Malloc.Free(pidl);
  end
  else
    Result:='';
end;
Dann noch einen Code hierzu:
Zitat:

Zitat von Martin K
Aber noch ein paar Vorschläge:
- unter Prozesse fehlt bei manchen der Pfad und daher auch das Icon.
Tipp: wenn nur der Dateiname da steht, z.B. calc.exe könntest Du über die EnvironmentVariable Path und mithilfe von FileExists evtl. den Pfad herausfinden.
- unter Dienste fehlen ziemlich viele Icons. Evtl. müsstest Du, um an den Pfad des Icons heran zu kommen, Parameter aus dem Pfad herausfiltern und Anführungsstriche entfernen, dazu gab es hier mal einen ganz guten Code.

Die folgende Funktion entfernt die Parameter, die nach einer Leertaste folgen können bzw. auch die "Anführungszeichen", expandiert die %Umgebungsvariablen%, und findet eine ausführbare Datei mittels der Umgebungsvariablen Path und PathExt.

Wenn die Datei nicht gefunden wurde, wird ein leerer String zurückgegeben, ansonsten der vollständige Dateiname.
Delphi-Quellcode:
function GetExecFileName(const Command: String): String;

  function ExpandEnvironmentPath(const Path: String): String;
  begin
    SetLength(Result,ExpandEnvironmentStrings(PChar(Path),nil,0));
    ExpandEnvironmentStrings(PChar(Path),PChar(Result),Length(Result));
    Result:=PChar(Result);
  end;

var b: Boolean; i,j: Integer; s: String; Path, PathExt: TStrings;
begin
  s:=Trim(ExpandEnvironmentPath(Command));
  if (s='') or FileExists(s) then
    Result:=s
  else
  begin
    i:=1;
    b:=False;
    while (i<=Length(s)) and ((s[i]<>' ') or b) do
    begin
      if s[i]='"' then
        b:=not b;
      Inc(i);
    end;
    s:=Trim(StringReplace(Copy(s,1,i-1),'"','',[rfReplaceAll]));
    if (s='') or FileExists(s) then
      Result:=s
    else
    begin
      Path:=TStringList.Create;
      PathExt:=TStringList.Create;
      try
        Path.Delimiter:=PathSep;
        Path.DelimitedText:=GetEnvironmentVariable('Path');
        Path.Append(ExpandEnvironmentPath('%UserProfile%'));
        Path.Append(ExpandEnvironmentPath('%SystemDrive%'));
        PathExt.Delimiter:=PathSep;
        PathExt.DelimitedText:=LowerCase(GetEnvironmentVariable('PathExt'));
        if PathExt.Count>0 then
          for i:=0 to Pred(PathExt.Count) do
            if FileExists(ChangeFileExt(s,PathExt[i])) then
            begin
              Result:=ChangeFileExt(s,PathExt[i]);
              Exit;
            end;
        if Path.Count>0 then
          for j:=0 to Pred(Path.Count) do
          begin
            if FileExists(IncludeTrailingPathDelimiter(Path[j])+s) then
            begin
              Result:=IncludeTrailingPathDelimiter(Path[j])+s;
              Exit;
            end
            else
            if PathExt.Count>0 then
              for i:=0 to Pred(PathExt.Count) do
                if FileExists(ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+s,PathExt[i])) then
                begin
                  Result:=ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+s,PathExt[i]);
                  Exit;
                end;
          end;
        Result:='';
      finally
        Path.Free;
        PathExt.Free;
      end;
    end;
  end;
end;
Beispiel:
Delphi-Quellcode:
GetExecFileName('calc');
liefert:
C:\WINDOWS\system32\calc.exe
zurück.

Mazel 24. Nov 2006 07:24

Re: MyPC (SystemInfo Programm)
 
Danke an Muetze1 und Martin K. Ich werde, sobald ich wieder Zeit dafür habe, die Codes verwenden um eine noch bessere Version zu bauen. :)

Danke nochmal :thumb:

Gruß
Mazel

stonimahoni 24. Nov 2006 08:27

Re: MyPC (SystemInfo Programm)
 
hi..


dein prog gefällt mir sehr gut. alle achtung :thumb: :thumb:

wenn du nun noch schaffst ( sofern du das überhaupt möchtest ), die smart werte und die temps der hdds (aller, zumal everest z.b. das irgendwie nicht schafft - bei aktuellen chips) und der cpu usw auszulesen und anzuzeigen, wird es einen festen platz bei mir einnehmen :)



ps.: den code stellst du nicht noch zur verfügung oder? würde mich echt mal interessieren wie du so diverses gelöst hast


big thx und mfg und vor allem : viel erfolg bei der weiterentwicklung


carsten

Mazel 24. Nov 2006 12:24

Re: MyPC (SystemInfo Programm)
 
Danke für das Feedback :wink:
Zitat:

wenn du nun noch schaffst ( sofern du das überhaupt möchtest ), die smart werte und die temps der hdds (aller, zumal everest z.b. das irgendwie nicht schafft - bei aktuellen chips) und der cpu usw auszulesen und anzuzeigen, wird es einen festen platz bei mir einnehmen
Damit habe ich mich nun noch garnicht beschäftigt, da müsste ich mich ersteinmal einarbeiten.

Zu den Code: Ich kann jedem gerne bestimmte Teile aus meinem Programm geben, das ist kein Problem, nur, wenn ich den gesamten Code veröffentliche ist es nicht mehr Freeware sondern OpenSource, was mir nicht so gefällt. Aber wie gesagt, gerne gebe ich Funktionen oder Prozeduren, einfach fragen.

Gruß
Mazel

RWarnecke 14. Mai 2007 20:34

Re: MyPC (SystemInfo Programm)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
nice Tool. Ich bastel gerade auch an solch einem Tool. Ich probiere mich dabei es auf die Betriebssystem Win2000, Win2003, WinXp und WinVista zum laufen zu bekommen.

Ich habe gerade mal Dein aktuellste Version vom Tool unter Windows XP getestet und habe die folgende Fehlermeldung im Anhang erhalten.

Zitat:

Zitat von Mazel
Zu den Code: Ich kann jedem gerne bestimmte Teile aus meinem Programm geben, das ist kein Problem, nur, wenn ich den gesamten Code veröffentliche ist es nicht mehr Freeware sondern OpenSource, was mir nicht so gefällt. Aber wie gesagt, gerne gebe ich Funktionen oder Prozeduren, einfach fragen.

Dazu würde mich eigentlich nur interessieren, wie Du die Speicherauslastung von den Processen ausliest und mir da eventuelle einen Tipp geben könntest. Ich bastel nämlich gerade an einem gleichen Programm. Unter .NET Framework habe ich es mittlerweile geschafft mit C#. Schreibe mir doch bitte einfach eine kurze PN, wie Du es gemacht hast, mit eventuellen Quellen, Links etc.

Danke für Deine Mühen im vorraus.

Mazel 15. Mai 2007 12:10

Re: MyPC (SystemInfo Programm)
 
Danke dir für die Info.

Der Fehler bei den Systemverzeichnisen existiert schon lange, und ich habe bisher keine Zeit gefunden, den Fehler zu beheben, jetzt aber werde ich mich wieder an die Arbeit machen.

Zu deiner Frage, die Informationen des Speichers lese ich über das WMI Interface aus. Ich habe dir dazu eine PN geschickt mit einem Beispiel Programm, der aus Codefragmenten meines Programmes besteht.

Gruß
Mazel

RWarnecke 20. Mai 2007 11:40

Re: MyPC (SystemInfo Programm)
 
Hi,

ich habe noch einen kleinen Fehler gefunden. Wird Dein Programm auf einem Rechner ausgeführt, welcher mehr als 2GB physikalischen Arbeitsspeicher beistzt, werden nur 2GB angezeigt.

Mazel 20. Mai 2007 12:08

Re: MyPC (SystemInfo Programm)
 
Oh, danke.

Das ist scheinbar bisher noch keinem aufgefallen. Ich denke mal dass das Programm welche getestet haben, die mehr als 2 GB haben.

Nun gut, ich werde mich darum kümmern, aber extra 1 GB zu meinem noch dazu kaufen werde ich nicht. :wink:

Gruß
Mazel


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.
Seite 7 von 10   « Erste     567 89     Letzte »    

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