AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

Ein Thema von Kathmai · begonnen am 11. Apr 2014 · letzter Beitrag vom 15. Apr 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#1

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 09:42
Statt hier copyrightgeschützten Quelltext der Firemonkey-Bibliotheken zu posten
Die Demos von Delphi sind seit 5 Jahren öffentlich und für alle frei zugänglich.
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.
http://sourceforge.net/projects/radstudiodemos/
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/
http://docwiki.embarcadero.com/CodeE...ategory:Sample
http://docwiki.embarcadero.com/CodeE...olsDemo_Sample
http://docwiki.embarcadero.com/RADSt...Changes_for_XE
...

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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Apr 2014 um 09:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 11:24
Die Demos von Delphi sind seit 5 Jahren öffentlich und für alle frei zugänglich.
radstudiodemos-code\Object Pascal\FireMonkey Desktop\MetropolisUIFlipViewDemo\FMX.FlipView.Data .pas
Ok, ich habe mich verguckt, ich dachte die Datei wäre aus der Bibliothek von FireMonkey.

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.
Leider nicht. Das war das erste was ich in XE5 gemacht hatte.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#3

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 13:27
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:
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;
Also ActiveX zum Uses-Abschnitt hinzu und OleInitialize in der Procedure aufrufen.
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:
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;
Im Ergebnis steht dann also keine ImagingFactory zur Verfügung und dann kracht's eben.

Geändert von Harry Stahl (12. Apr 2014 um 13:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#4

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 16:23
Dann wäre wohl das am Ende der Unit am sinnvollsten:
Delphi-Quellcode:
initialization
  OleInitialize(nil);

finalization
  OleUninitialize;
// EDIT:
Helfen tut das bei mir allerdings nichts. Es geht nach wie vor nicht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#5

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 16:43
Dann wäre wohl das am Ende der Unit am sinnvollsten:
Delphi-Quellcode:
initialization
  OleInitialize(nil);

finalization
  OleUninitialize;
// EDIT:
Helfen tut das bei mir allerdings nichts. Es geht nach wie vor nicht.
Wobei ich ja geschrieben habe, dass es nicht funktioniert, wenn man das wie hier von Dir vorgeschlagen macht (was ich ja normalerweise auch so machen würde). Bei mir klappt es nur, wenn ich OleInitialize direkt am Anfang der Prozedur aufrufe.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#6

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 21:40
Entschuldigung, das habe ich überlesen.

// EDIT:
Klar, das Load wird ja in einem eigenen Thread aufgerufen...
Und OLE muss pro Thread initialisiert werden. Sprich:
Delphi-Quellcode:
procedure TSplashImagesLoader.Execute;
begin
  if not Assigned(Form) or not Assigned(FImages) then
    Exit;

  Synchronize(FForm.ShowSplashLoading);
  try
    OleInitialize(nil);
    try
      FImages.Load;
    finally
      OleUninitialize;
    end;
  finally
    Synchronize(FForm.HideSplashLoading);
  end;
end;
// EDIT2:
Ich habe es mal in die QC gepackt:
http://qc.embarcadero.com/wc/qcmain.aspx?d=124025
Sebastian Jänicke
AppCentral

Geändert von jaenicke (12. Apr 2014 um 23:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 23:27
Wobei ich gerade feststelle, dass nicht alle Bilder eingelesen werden, einige dazwischen sind schwarz, mitunter in zufälliger Reihenfolge.

Vorab sei noch mal bemerkt, dass in Delphi XE3 (nach meiner Meinung bislang noch die stabilste FMX-Fassung) noch alles richtig funktionierte, sowohl unter 32 als auch unter 64 bit.

Klar, das Load wird ja in einem eigenen Thread aufgerufen...
Und OLE muss pro Thread initialisiert werden. Sprich ...
Ja, so wäre es wohl richtig. Dennoch werden nicht alle Bilder gelesen, einige sind schwarz.

Erst wenn man ein Synchronize auch für die Load-Funktion hinzufügt:

Synchronize (FImages.Load); geht es.

Was eigentlich Unsinn ist, da man Synchronize ja normalerweise nur für den Aufruf von Proceduren des Mainthreads verwendet. FImages ist aber eine lokale Thread-Variable vom Typ der Klasse "TAbstractDataSource", gehört nach meinem Verständnis also zu dem Thread "TSplashImagesLoader". Irgendwie könnte man den Verdacht bekommen, die Thread-Verwaltung funktioniert seit XE4 nicht mehr so richtig in FireMonkey. Wir hatten hier ja schon mal so ein Problem, mit Videoaufnahmen in Zusammenhang mit einem Thread, wo das alles nicht (mehr) so richtig funktionierte (Demo VideoCaptureHD)...

Es wäre schön, wenn EMBA bei einer neuen Delphi- Version einfach mal die eigenen mitgelieferten Demos testen würde, ob die noch funktionieren...

Geändert von Harry Stahl (12. Apr 2014 um 23:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Kathmai
Kathmai

Registriert seit: 3. Sep 2003
Ort: Böblingen
21 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 12. Apr 2014, 16:26
Hallo...

Vielen Dank erstmal an Euch für die antworten.
Komisch ist nur (es werden ca. 66 JPEG's geladen) das die Fehlermeldung nur einmal kommt.

@Harry: Hab das mal so geändert wie Du es in Deinem letzten Beitrag geschrieben hast. Kann es aber erst am Montag testen da der PC wo es nicht funktioniert auf Arbeit steht.

Es sind aber beide (Entwicklungs-PC und dort wo es nicht funktioniert) Win 7 64Bit.

Dank Dir - werde am Montag mal Rückmeldung geben.

Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 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