Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 12. Apr 2014, 14: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 14:45 Uhr)
  Mit Zitat antworten Zitat