![]() |
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:
Bei mein Vaters Rechner kommt der Fehler beim Autostartverzeichniss aber warum, weis ich nicht.
{--[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; 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:
und den Wert von RegDone.
HKLM\SOFTWARE\Microsoft\Windows( NT)\CurrentVersion\';
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:
Gruß Mazel |
Re: MyPC (SystemInfo Programm)
Ok, kurzer Code dazu:
Delphi-Quellcode:
lbMonitorList = TListBox
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; 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... |
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:
Dann noch einen Code hierzu:
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; Zitat:
Wenn die Datei nicht gefunden wurde, wird ein leerer String zurückgegeben, ansonsten der vollständige Dateiname.
Delphi-Quellcode:
Beispiel:
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;
Delphi-Quellcode:
liefert:
GetExecFileName('calc');
C:\WINDOWS\system32\calc.exe zurück. |
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 |
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 |
Re: MyPC (SystemInfo Programm)
Danke für das Feedback :wink:
Zitat:
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 |
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:
Danke für Deine Mühen im vorraus. |
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 |
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. |
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. |
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