AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Direct2D 1.1 CreateDeviceContext

Direct2D 1.1 CreateDeviceContext

Ein Thema von SonnyBoyPro · begonnen am 31. Jan 2014 · letzter Beitrag vom 4. Feb 2014
Antwort Antwort
TiGü

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

AW: Direct2D 1.1 CreateDeviceContext

  Alt 3. Feb 2014, 10: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 12:09 Uhr)
  Mit Zitat antworten Zitat
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#2

AW: Direct2D 1.1 CreateDeviceContext

  Alt 4. Feb 2014, 09:06
Hallo TiGü,

danke für die Info.
Header hätte ich vom Windows 8.0 SDK genommen. Gibts noch ein anderes Package?
Hab die d2d1_1.h nochmals angesehen -> Reihenfolge tatsächlich anders

Ich muss das Package sowieso nochmal durchschauen, weil ich auch teilweise die Übergabe nicht richtig deklariert habe. Also Txx statt PTxxx.

JSB: ja, da hatte ich auch schon meine Probleme damit, z.B. funktioniert irgendein Aufruf nicht, weil Delphi meinte das die Typen so nicht zusammenpassen, was aber laut MSDN so funktionieren musste --> JSB angepasst, ging.

Drum hab ich auch für mein Projekt die JSB abgespalten und verwende die Source-Dateien direkt und passe an wo notwendig.

bg

PS: sobald die Header ordentlich übersetzt sind, werden sie natürlich gepostet
  Mit Zitat antworten Zitat
TiGü

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

AW: Direct2D 1.1 CreateDeviceContext

  Alt 4. Feb 2014, 09:37
Header hätte ich vom Windows 8.0 SDK genommen. Gibts noch ein anderes Package?
Ich hab jetzt einfach das genommen, was bei der Installation von Visual Studio 2013 mitkommt (C:\Program Files (x86)\Windows Kits\8.1\Include\um).
Im Zweifelsfall einfach herunterladen: http://msdn.microsoft.com/en-US/wind...sktop/bg162891

JSB: ja, da hatte ich auch schon meine Probleme damit, z.B. funktioniert irgendein Aufruf nicht, weil Delphi meinte das die Typen so nicht zusammenpassen, was aber laut MSDN so funktionieren musste --> JSB angepasst, ging.
Drum hab ich auch für mein Projekt die JSB abgespalten und verwende die Source-Dateien direkt und passe an wo notwendig.
Und wenn du die Winapi.D2D1.pas als Grundlage nimmst, die beim RAD Studio eh mit dabei ist?
Vielleicht ist dort auch nicht alles korrekt, aber zumindest hat die jeder ab RAD Studio 2010.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:32 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