Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Direct2D 1.1 CreateDeviceContext

  Alt 3. Feb 2014, 11:11
Wie ich vermutet hatte, du hast die Reihenfolge der Interface-Methoden vertauscht.

Oder besser gesagt, du hast das für bare Münze genommen, was in der MSDN steht.
Hier musst du Vorsicht walten lassen, weil in der MSDN die Methoden idR. alphabetisch sortiert sind.
Das muss aber in den Orginaldefinition nicht sein!
Dadurch kommt die virtual method table (VMT) durcheinander.
Siehe auch hier!

Du musst dich beim Übersetzen immer an die Microsoft-Header direkt halten.

Dadurch, dass ClearResources vor CreateDeviceContext definiert wurde, hat sich alles verschoben und das Device hat die CreatePrintControl-Methode verwendet, obwohl du CreateDeviceContext gerufen hast.

Richtig(er) wäre also:

Delphi-Quellcode:
    IPrintDocumentPackageTarget = interface(IUnknown)

    end;

    ID2D1Device = interface(ID2D1Resource)
    ['{47dd575d-ac05-4cdd-8049-9b02cd16f44c}']
      function CreateDeviceContext(const options: TD2D1_DEVICE_CONTEXT_OPTIONS; out deviceContext: ID2D1DeviceContext): HResult; stdcall;
      function CreatePrintControl(wicFactory: IWICImagingFactory;
        documentTarget: IPrintDocumentPackageTarget;
        printControlProperties: TD2D1_PRINT_CONTROL_PROPERTIES;
        out printControl: ID2D1PrintControl): HResult; stdcall; // ToDo needs DocumentTarget.h --> Jedi ?!?
      function SetMaximumTextureMemory(maximumInBytes: UINT64): HResult; stdcall;
      function GetMaximumTextureMemory: UINT64; stdcall;
      function ClearResources(millisecondsSinceUse: UINT32 = 0): HResult; stdcall;
    end;
Das gleiche Problem hast du dann weiter unten im auskommentierten Code für m_d2dContext.CreateBitmapFromDxgiSurface.
Auch die Defintion von ID2D1DeviceContext ist ein bisschen durcheinander geraten.

Irgendwie sind auch die von dir verwendeten Header nicht ganz korrekt.
Bspw. musst du für SetTarget das ID2D1Bitmap1 noch umcasten nach ID2D1Image.
Eigentlich ist das aber nicht nötig!

Das liegt an der falschen Vererbungslinie in D2D1.pas von diesen J S Bladen.
Korrekt wäre ist ID2D1Bitmap1 -> ID2D1Bitmap -> ID2D1Image -> ID2D1Resource -> IUnknown.
In dieser Übersetzung ist aber Bitmap direkt von Resource abgeleitet.

Geändert von TiGü ( 3. Feb 2014 um 13:09 Uhr)
  Mit Zitat antworten Zitat