![]() |
Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Hallo Leute,
hab ein kleines Problem. Habe das Firemonkey Sample "FlipViewDemo" etwas abgeändert. Funktioniert soweit aber auf dem Entwicklungs PC läuft es beim Laden der Bilder ohne Probleme. Auf dem PC wofür das Programm bestimmt ist, kommt eine Zugriffsverletzung und zwar in Form von "Zugriffsverletzung bei Adresse .....A14554 in Modul 'ScreenPlayer.exe'. Lesen von Adresse 0000000000000000". Die Bilder werden von einem Ordner geladen (JPEG's) und im Sample Programm in einem Thread geladen im Hintergrund. Auf dem Entwicklungs-PC läuft alles Problemlos auf dem anderen kommt der Fehler. - Selben Bilder und Anzahl wird verwendet. 2. PC wo die Zugriffsverletzung kommt: Zotac nano AQ-01 mit Samsung EVO 120 GB und 4GB RAM - CPU AMD A4-5000 - Beides Win7 Pro 64Bit Debuggen kann ich auch nicht da Delphi den Prozess nicht "erzeugen" kann. Hab schon Delphi mit admin Rechten gestartet aber bringt auch nix. Kann das Programm nur ohne Debugger zum laufen kriegen. Hat jemand eine Ahnung woran das liegen könnte? Hier die Ladefunktion (nichts verändert gegenüber des Samples von Embarcadero).
Delphi-Quellcode:
Danke im vorraus!
procedure TImageDataSource.Load;
var SR: TSearchRec; Res: Integer; I: Integer; ImagesFilter: string; begin I := 0; // Find all images ImagesFilter := ImagesPath + '*.jpg'; Res := FindFirst(ImagesFilter, faAnyFile, SR); while Res = 0 do begin SetLength(FImages, I + 1); try FImages[I] := TBitmap.CreateFromFile(ImagesPath + SR.Name); except showmessage('Fehler'); end; Res := FindNext(SR); Inc(I); end; if Length(FImages) > 0 then FCurrentIndex := 0 else FCurrentIndex := -1; end; |
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Ich hab zwar von FM keinen Plan, aber bist Du sicher, dass der Fehler im geposteten Code auftritt? Die Speicheradresse lässt ja eher einen Null-Poiter-Zugriff vermuten, dafür kann ich im gezeigten Code keine Möglichkeit erkennen.
|
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
|
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
|
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
Zitat:
Außerdem: Läuft denn die ursprüngliche Fassung? (Kannst du ggf. ja aus dem ![]() |
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
|
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Also bei mir kommt die Schutzverletzung auch (XE5, 32-Bit und 64-Bit Kompilat). Das passiert direct bei der Benutzung des IWICImagingFactory Interfaces in TBitmapCodecWIC.LoadFromFile in dieser Zeile:
Delphi-Quellcode:
Das wird in dem von dir geposteten Quelltext in TBitmap.CreateFromFile benutzt. Da kann ich so auf den ersten Blick leider auch nicht helfen, ich muss los. Ich schaue später noch einmal drauf.
TCanvasD2D.ImagingFactory.CreateDecoderFromStream(SA, GUID_NULL, WICDecodeMetadataCacheOnDemand, dec);
... |
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
radstudiodemos-code\Object Pascal\FireMonkey Desktop\MetropolisUIFlipViewDemo\FMX.FlipView.Data .pas Es ist das Einzige, was man praktisch wöchentlich am Delphi aktualisieren kann, auch nach dem Jahr noch. ![]() ![]() ![]() ![]() ![]() ... Wenn das Demoverzeichnis nicht bereits als SVN-Repository vorliegt, dann kann man es einfach neu auschecken. Ansonsten mal updaten und schauen, ob es eventuell einen Bugfix gab. |
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Zitat:
Zitat:
|
AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Da steht aus irgendeinem Grund unter 64-Bit irgendwie die OLE-Funktionalität nicht richtig zur Verfügung.
Retten könnt Ihr es unter WIN64 so:
Delphi-Quellcode:
Also ActiveX zum Uses-Abschnitt hinzu und OleInitialize in der Procedure aufrufen.
procedure TImageDataSource.Load;
const ImagesPath = './images/'; var SR: TSearchRec; Res: Integer; I: Integer; ImagesFilter: string; begin oleInitialize (NIL); // HS: ADD + ActiveX to units I := 0; // Find all images ImagesFilter := ImagesPath + '*.jpg'; Res := FindFirst(ImagesFilter, faAnyFile, SR); while Res = 0 do begin SetLength(FImages, I + 1); FImages[I] := TBitmap.CreateFromFile(ImagesPath + SR.Name); Res := FindNext(SR); Inc(I); end; if Length(FImages) > 0 then FCurrentIndex := 0 else FCurrentIndex := -1; FindClose (sr); // HS: ADD end; Ein Aufruf von OleInitialize zur Intialisierung der Unit reicht nicht, anscheinend gibt es irgendwo zwischendurch an anderer Stelle ein OleUnitialize. [nur am Rande bemerkt: Findclose habe ich auch hinzugefügt, wird gerne vergessen und führt zu einer Vielzahl von Problemen] Der Fehler tritt genau hier auf:
Delphi-Quellcode:
Im Ergebnis steht dann also keine ImagingFactory zur Verfügung und dann kracht's eben.
class function TCanvasD2D.ImagingFactory: IWICImagingFactory;
begin if not Assigned(FImagingFactory) then begin CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, FImagingFactory); // <-- Hier wird unter Win64 immer NIL zurückgeliefert, wenn OLEInitialize zuvor nicht aufgerufen wurde end; Result := FImagingFactory; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 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