AW: Spectragram
Zitat:
Fehlen bei dir unter Move Background drei Komponente. 2x Checkboxen und eine Trackbar. Ich habe jetzt mal das hier addiert damit müsste es eigentlich funktionieren.
Delphi-Quellcode:
Mit IsCompositionEnabled lade ich die dwmapi.dll..
if (GetOS = OsVista) or (GetOS = OsWindows7)
and SkinEngine.IsCompositionEnabled then begin
Delphi-Quellcode:
Ich denke das wird aber auch nicht ausreichen, denn was mache ich wenn die DLL nicht existiert dann kracht es auch.
function TSkinEngine.IsCompositionEnabled: boolean;
var DwmIsCompositionEnabled: function(pfEnabled: PBoolean): HRESULT; stdcall; hDwmapi: THandle; Enabled: BOOL; begin Result := False; if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6) then begin hDwmapi := LoadLibrary('dwmapi.dll'); if hDwmapi <> 0 then try DwmIsCompositionEnabled := GetProcAddress(hDwmapi, 'DwmIsCompositionEnabled'); if Assigned(DwmIsCompositionEnabled) then Result := (DwmIsCompositionEnabled(@Enabled) = 0) and Enabled; finally FreeLibrary(hDwmapi); end; end; end; Na ja oder auch nicht.. hDwmapi ist ja dann 0 Habe die geänderte DLL nochmals angehängt. Vielleicht geht es ja damit. gruss |
AW: Spectragram
Die sind mir gar nicht aufgefallen.
Na ja, wenn du die DLL nicht laden kannst, dann musst du eben eine Fehlerbehandlung machen. Hinweis ausgeben und das Programm sauber beenden. Schön wäre natürlich ein Fallback, der ohne die DLL auskommt, so dass man das Programm zu mindest noch nutzen kann. |
AW: Spectragram
Nope. Stürzt bei Klick auf den Button ab. AberMmoment mal. Am Skinengine kann es nicht liegen. Das Fenster wird ja geskinnt. Das funktioniert ja alles. Der Fehler mit dem Absturz kommt ja erst, wenn der Dateiöffnen Code durch den Klick aufgerufen wird. Da müsste der Fehler zu suchen sein. Hast du irgendwelche Pfade hard gecodet oder so?
|
AW: Spectragram
Zitat:
Obwohl die Behandlung ja dadurch schon ausgelöst wird da die Abfrage False zurück liefert bei einem hDwmapi = 0 Den Fallback hätte ich dann mit der Abfrage von IsCompositionEnabled erstellt. Bin mir jetzt nicht sicher ob wenn er die DLL nicht findet ein Exeption ausgelöst wird. Oder ein Handle 0 ausreicht. gruss |
AW: Spectragram
LoadLibrary ist eine API Funktion und wird somit keine Exception auslösen. Der Rückgabewert ist ein Handle auf die DLL. Ist das Handle null, konnte sie nicht geladen werden.
|
AW: Spectragram
Zitat:
DriveList DirList FileList. Bei der DriveList werden alle Festplatten addiert.
Delphi-Quellcode:
also nichts festes.
procedure TSkinDriveList.ListDrive(hList: hWnd);
var FileInfo: SHFILEINFO; AllDriveStrings: LongWord; Drives: array [0 .. 128] of Widechar; pDrive: PChar; IconCount: Integer; begin IconCount := 1; DriveList := TStringList.Create; AllDriveStrings := GetLogicalDriveStrings(SizeOf(Drives), Drives); if AllDriveStrings = 0 then exit; if AllDriveStrings > SizeOf(Drives) then raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY)); pDrive := Drives; while pDrive^ <> #0 do begin SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON); if GetDriveType(pDrive) = DRIVE_NO_ROOT_DIR or DRIVE_FIXED then begin DriveList.Add(pDrive); ListAdd(hList, FileInfo.szDisplayName); SetLength(IconHandle, IconCount + 1); IconHandle[IconCount] := FileInfo.HIcon; inc(IconCount); inc(pDrive, 4); end else inc(pDrive, 4); end; end; Mit GetCurrentDirectory wird der letzte Pfad zugewiesen der verwendet wurde. Wenn keiner existiert dann ist es der Pfad wo sich die Skins drin befinden. Die Fileliste addiert die Dateien abhängig von dem Pfad der mit DirList gesetzt wurde. Vorausgesetzt es finden sich MP3 Dateien darin. Hard gecoded sollte da eigentlich nichts sein. gruss |
AW: Spectragram
Zitat:
Handle 0 sollte dann reichen. Ich werde mal den Pfad der Anwendung ändern also auf eine andere Platte. Mal sehen ob ich das reproduzieren kann. EDIT: Nop.. Kann den bin Ordner hinschieben wo ich will, Voraussetzung ist natürlich das ich vorher die INI Datei lösche da hier ein fest eingeschriebener Pfad zum letzten Skin enthalten ist. Danach startet alles wie es soll. gruss |
AW: Spectragram
Ein paar Dinge.
Delphi-Quellcode:
Und dann machst du das:
Drives: array [0 .. 128] of Widechar;
pDrive: PChar;
Delphi-Quellcode:
Du weißt einem PChar ein Array vom Typ WideChar zu. Keine Ahnung, ob das so in Ordnung ist. Kommt mir auf den ersten Blick komisch vor.
pDrive := Drives
Delphi-Quellcode:
Würde ich vor der ersten Verwendung mit ZeroMemory "ausnullen". Schlägt nämlich SHGetFileInfo fehl, du prüfst es nicht, dann steht in FileInfo Schrott drin, mit dem du dann weiter arbeitest.
FileInfo: SHFILEINFO;
Wo wird die Stringliste wieder freigegeben? Besser: Der Aufrufer erzeugt die StringListe, übergibt sie als Parameter und gibt sie wieder frei. Dann kann man sie auch sauber in einem Ressourcenschutzblock verpacken. Erstellen und Freigeben in einer Routine macht es auch übersichtlicher. |
AW: Spectragram
Zitat:
Auch das mit dem ZeroMemory werde ich noch hinzufügen sind so kleine Dinge die man leicht übersieht im Eifer des Gefechtes. gruss |
AW: Spectragram
Rückgabewert von SHGetFileInfo prüfen!
Mit der StringListe nicht routineübergreifend arbeiten! Ja, das ist so eine Sache. Eigentlich müsste der Code crashen, tut er aber bei Alice nicht, weil bei ihr die Belegung des Adressraums glücklicherweise passt und nichts wichtiges überschieben oder freigeben wird. Bei Bobby ist der Adressraum anders organsiert und da crasht es dann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 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