![]() |
DirectX9 Header für 64Bit
Hat die jemand bzw. gibt es die?
Delphi-Quellcode:
Schlägt fehl unter 64Bit in 32Bit funktioniert es.
hr := m_pD3DDirect3d.CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, 0, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dpp, m_pD3DDevice); gruss |
AW: DirectX9 Header für 64Bit
Nutzt du die neue Community Edition für 64-Bit?
Da bietet es sich an, die Header zu nehmen, die mit dabei sind. Beispielpfad: C:\Program Files (x86)\Embarcadero\Studio\19.0\source\rtl\win Folgendes kleines Beispielprojekt kompiliert und erzeugt eine IDirect3DDevice9-Instanz unter 32- und 64-Bit:
Delphi-Quellcode:
unit Unit3;
interface uses Winapi.Windows, Vcl.Forms, Winapi.Direct3D9; type TForm3 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.dfm} procedure DebugOutput(const AText: string); begin OutputDebugString(PChar(AText)); end; procedure TestDirect3D9(const AForm: TForm); var m_pD3DDirect3d: IDirect3D9; hr: HRESULT; d3dpp: TD3DPresentParameters; m_pD3DDevice: IDirect3DDevice9; begin m_pD3DDirect3d := Direct3DCreate9(D3D_SDK_VERSION); ZeroMemory(@d3dpp, SizeOf(d3dpp)); d3dpp.BackBufferWidth := AForm.ClientWidth; d3dpp.BackBufferHeight := AForm.ClientHeight; d3dpp.BackBufferCount := 1; d3dpp.BackBufferFormat := D3DFMT_UNKNOWN; d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow := AForm.Handle; d3dpp.Windowed := True; hr := m_pD3DDirect3d.CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 0, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dpp, m_pD3DDevice); case hr of D3D_OK: DebugOutput('Alles chic!'); D3DERR_DEVICELOST: DebugOutput('Gerät wech!'); D3DERR_INVALIDCALL: DebugOutput('Falscher Aufruf'); D3DERR_NOTAVAILABLE: DebugOutput('Is nich!'); D3DERR_OUTOFVIDEOMEMORY: DebugOutput('Kein Platz'); else DebugOutput('Alles kaputt'); end; end; procedure TForm3.FormCreate(Sender: TObject); begin TestDirect3D9(Self); end; end. |
AW: DirectX9 Header für 64Bit
Danke erst mal für den Code.
Mein Problem ist nicht das erstellen der IDirect3DDevice9-Instanz das funktioniert mit gleichen Code unter 32Bit. Aber nicht unter 64Bit.
Delphi-Quellcode:
Fehler:
function BuildDirect3d(_hMediaWindow: HWND; var m_pD3DDevice: IDirect3DDevice9; var ErrStr: string): BOOL;
var hr: HRESULT; m_pD3DDirect3d: IDirect3D9; d3ddm: D3DDISPLAYMODE; d3dpp: D3DPRESENT_PARAMETERS; begin result := false; ErrStr := 'No Error'; m_pD3DDirect3d := Direct3DCreate9(D3D_SDK_VERSION); if (m_pD3DDirect3d = nil) then begin ErrStr := ReportError('Cannot initialize Direct3D', E_FAIL); exit; end; hr := m_pD3DDirect3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm); if (FAILED(hr)) then begin ErrStr := ReportError('Cannot get display adaptater infos from Direct3d', hr); exit; end; FillChar(d3dpp, sizeof(d3dpp), 0); d3dpp.Windowed := TRUE; d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat := d3ddm.Format; d3dpp.hDeviceWindow := _hMediaWindow; hr := m_pD3DDirect3d.CreateDevice(D3DADAPTER_DEFAULT, // always the primary display adapter D3DDEVTYPE_HAL, 0, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dpp, m_pD3DDevice); if (FAILED(hr)) then ErrStr := ReportError('Cannot create a Direct3d device', hr) else result := TRUE; end; 'Cannot create a Direct3d device : COM Error 0x8876086C' (Nur mit 64Bit!) PS: Es liegt an den Headern.. gruss |
AW: DirectX9 Header für 64Bit
Benutzt du denn die von TiGü erwähnten mitgelieferten Header? Würde ich auch wärmstens empfehlen (die alten - manuellen - C-Ports haben teilweise diverse Bugs wie fehlende
Delphi-Quellcode:
Direktiven, etc). Der Code 0x8876086C ist
{$Z4}
Delphi-Quellcode:
, könnte also gut sein, dass ein Delphi Enum mit 8-Bit in ein 64-Bit Register gepackt wird, ohne die unbenutzen Bytes zu clearen, weshalb die D3D API dann einen ungültigen Wert registriert.
D3DERR_INVALIDCALL
|
AW: DirectX9 Header für 64Bit
Siehe Zacherls Beitrag!
Deine Funktion läuft hier mit der Winapi.Direct3D9-Unit problemlos in 64-Bit. ErrStr = 'No Error' und m_pD3DDevice ist gefüllt. |
AW: DirectX9 Header für 64Bit
Zitat:
Zitat:
Aber mir fehlen MediaTypen die im Code von Emba nicht enthalten sind. bsp. MEDIATYPE_Subtitle, DXVA_ModeH264_E, DXVA_ModeH264_F (DirectShow9) und andere.
Delphi-Quellcode:
{$EXTERNALSYM DXVA_ModeH264_E}
DXVA_ModeH264_F : TGUID = (D1:$1b81be69; D2:$a0c7; D3:$11d3; D4:($b9,$84,$00,$c0,$4f,$2e,$73,$c5)); gruss |
AW: DirectX9 Header für 64Bit
Zitat:
|
AW: DirectX9 Header für 64Bit
Zitat:
Muss das noch mit 32Bit testen denke aber das sollte auch funktionieren. PS: Nein muss die alten Header für 32Bit behalten. Danke für die Hilfe.. gruss |
AW: DirectX9 Header für 64Bit
Geht immer noch nicht wirklich.
1 Fehler in VMR7 Renderer funktioniert in 32Bit aber nicht in 64Bit Fehler! COM Error 0x80040227, The operation could not be performed because the filter is in the wrong state. oder COM Error 0x80040227, Der Vorgang konnte nicht ausgeführt werden, da der Filterstatus falsch ist.'
Delphi-Quellcode:
getestet mit meinen und den direkten Headern von Emba /rtl/win
function TVMR7.SetBitmapFromImage(Image_: TBitmap; nAlpha: word; bitmapRect: TRECT): BOOL;
var hr: HRESULT; nRect: VMR9NormalizedRect; sRect, dRect: TRECT; begin result := false; if (VMR7MixerBitmap = nil) then begin m_ErrorDescription := ReportError('Can''t set bitmap, no VMR7MixerBitmap', E_FAIL); exit; end; if Image_ = nil then begin alphaBitmap7.dwFlags := VMRBITMAP_DISABLE; hr := VMR7MixerBitmap.SetAlphaBitmap(alphaBitmap7); result := (SUCCEEDED(hr)); if result then bIsOverlayImage := false; exit; end; // Accept only 32bit ARGB or 24bit RGB formatted image if (Image_.PixelFormat <> pf32bit) and (Image_.PixelFormat <> pf24bit) then begin m_ErrorDescription := ReportError('not a supported bitmap format', E_FAIL); exit; end; if not PrepareDDSurface(Image_, bitmapRect) then exit; if FAILED(m_pWindowless.GetVideoPosition(sRect, dRect)) then exit; nRect := NormalizeRect(sRect, bitmapRect); alphaBitmap7.dwFlags := VMRBITMAP_ENTIREDDS; alphaBitmap7.hdc := 0; alphaBitmap7.pDDS := m_pDDSurface; alphaBitmap7.rDest.top := nRect.top; alphaBitmap7.rDest.left := nRect.left; alphaBitmap7.rDest.bottom := nRect.bottom; alphaBitmap7.rDest.right := nRect.right; alphaBitmap7.fAlpha := nAlpha / 255.0; alphaBitmap7.clrSrcKey := 0; // SHOW the bitmap hr := VMR7MixerBitmap.SetAlphaBitmap(alphaBitmap7); // Fehler nur unter 64Bit m_pWindowless.RepaintVideo(m_hMediaWindow, m_hMediaDC); result := (SUCCEEDED(hr)); if result then bIsOverlayImage := true; end; Der Video Renderer meldet keine Fehler (Filme spielen gut ab) nur das mit dem Overlay Bitmap will nicht. gruss |
AW: DirectX9 Header für 64Bit
Nach einen minimalen Beispielprojekt zu fragen wird wahrscheinlich abgelehnt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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