Toon posts:

TWaveformatex, Pwaveformatex, HELP !

Pagina: 1
Acties:

Verwijderd

Topicstarter
WaveFmt.wFormatTag := WAVE_FORMAT_PCM;
WaveFmt.nChannels := 1;
WaveFmt.wBitsPerSample := 16; WaveFmt.nSamplesPerSec := 44100;
WaveFmt.nBlockAlign := WaveFmt.wBitsPerSample div 8 * WaveFmt.nChannels;
WaveFmt.nAvgBytesPerSec := WaveFmt.nSamplesPerSec * WaveFmt.nBlockAlign;

Hallo mensen , ik heb een probleem. Als ik, zoals boven beschreven, WaveFmt, een PWaveFormatEX object (in delphi)
zijn attributen wil setten, crastht het programma. Gek want met een eerdere DirectX headerfile (DX2) wilde het wel. Als ik een TWaveFormatEx gebruik en ik zeg later

PrimBuffer.SetFormat(@WaveFmt)

dan crasht hij ook ! Wat moet ik nu doen dan ? Ik bedoel, ik moet die @ er toch voorzetten
om van een TWa.. een PWa... te maken ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:46
Welke fout krijg je dan?

't is misschien handig als je eens de quickstart doorneemt:
P&W Beleid

[ Voor 74% gewijzigd door whoami op 15-04-2003 10:48 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik krijg deze fout:

projectx.exe raised exception class EAccesViolation with message 'Acces violation at adress 00432E7D in module 'project1.exe' Read of adresss FFFFFFFF

in beide gevallen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:46
Heb je wel geheugen gealloceerd voor die objecten?
Heb je de constructor aangeroepen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
TWaveformatex is een packed record, die hebben geen constructor en worden aangemaakt zodra je ze declareert.

PWaveformatex is een pointer daarnaar oftewel ^TWaveformatex.

En, ik heb ook geprobeerd ZeroMemory(PWaveFormatex, sizeOf(Pwaveformatex)) aan te roepen, ook met TWaveformatex, maar dat wou oko niet.

Verwijderd

Topicstarter
En het is ook zo, dat met die DX2, wat trouwens DX3 was, headerfile, de IDirecSound en IDirectSoundBuffer als class gedeclareerd waren en niet als interface, zoals in de latere headerfiles. Hier heef took wat mee te maken denk ik! (Ik moest bijvoorbeeld als ik de IDirectsoundbuffers in een TList wou stoppen, expliciet met een @ aangeven dat ik een Pointer naar die interface wou opslaan. Met een class gebeurt dit automatisch. Dus moest ik ook weer terugcasten als ik hem eruit wou halen. Maar na het casten is het 'object' niet meer geldig !)

Een dergelijk probleem heb ik met die Waveformatex dus. Ik doe vantevoren
ZeroMemory(WaveFmt,SizeOf(TWaveFormat));
en ik kan dan ook gewoon die attributes instellen, maar zodra ik
PrimBuffer.SetFormat(WaveFmt) (IDirectSound interface dus)
crasht de boel.

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
(Ik moest bijvoorbeeld als ik de IDirectsoundbuffers in een TList wou stoppen, expliciet met een @ aangeven dat ik een Pointer naar die interface wou opslaan. Met een class gebeurt dit automatisch. Dus moest ik ook weer terugcasten als ik hem eruit wou halen. Maar na het casten is het 'object' niet meer geldig !)
Nooit object refs en interface refs door elkaar heen gebruiken!!!!. Een Interface gebruikt reference counting. Dit gaat mis als je het gaat gebruiken als object en/of converteert naar pointers (kan wel maar dan moet je precies weten wat je doet, zie bijv. weak references in VCL). Je mag dus NOOIT (dwz zo lang je niet een hele goede rede hebt om het wel te doen) een TList gebruiken om daarin pointers naar interfaces te stoppen. Gebruik in zo'n geval een TInterfaceList ipv TList. Ik denk dat jouw boven bescheven problemen voortkomen uit een verkeerd gebruik van interfaces. Lees dus eerst eea over interfaces in Delphi en zie of je problemen er dan nog steeds zijn

Verwijderd

Topicstarter
Bedankt voor de zinvolle reply. Ik zal proberen te werken met de TInterfaceList.

Verwijderd

Topicstarter
Alleen... TInterfacelist bestaat niet. Ikwq erk met Delphi 3. Is het misschien iets van een latere versie ofzo? Maar hoe kan je in D3 dan interface references storen in een lijst ?

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
aha. Delphi 3 heeft toch ook geen interface ondersteuning (dwz keyword Interface)? Ik heb geen ervaring met Delphi3 en weet dus ook niet hoe een COM client te maken met D3. Waarschijnlijk moet je zelf de ref counting doen. Dus AddRef en Release op de juiste plekken aanroepen (dit wordt in >= D4 automatisch gedaan waneer je gebruik maakt van interfaces).
Pagina: 1