![]() |
WaveInOpen - CALLBACK_FUNCTION - Problem
Also ich habe folgendes:
Delphi-Quellcode:
wenn ich nun Speak1 := TSpeak.create; aufrufe bekomm ich eine exception in der form: "Access violation at address 00138000. Write of address 00000001"
TSpeak = class(TObject)
private procedure waveInProc(SomeWaveIn: HWaveIn; uMsg: UINT; dwInstance: DWORD; dwParam1, dwParam2: DWORD); stdcall; public WaveIn: hWaveIn; constructor create; destructor free; end; //ganz normale klasse halt var Speak1: TSpeak; implementation {$R *.dfm} //normal stuff constructor TSpeak.create; var header: TWaveFormatEx; begin inherited; WaveIn := 0; with header do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := 1; nSamplesPerSec := 11050; wBitsPerSample := 8; nBlockAlign := 1; nAvgBytesPerSec := 11050; cbSize := 0; end; WaveInOpen(@WaveIn, WAVE_MAPPER, @header, DWORD(@Tspeak.WaveInProc), 1234567, CALLBACK_FUNCTION); // hier sind dann noch andere "befehle" .. die werden allerdings aufgrund einer exception nicht ausgeführt :( .. und sind somit für mein problem uninterresant end; procedure TSpeak.waveInProc(SomeWaveIn: HWaveIn; uMsg: UINT; dwInstance: DWORD; dwParam1, dwParam2: DWORD); stdcall; begin // bisher ne leer procedure .. nur für den compiler end; //destructor auch uninterresant In einem andere project wo ich mit CALLBACK_WINDOW anstelle von CALLBACK_FUNCTION arbeite tritt diese exception nicht auf .. daher liegt der Verdacht nahe das es an WaveInOpen liegt hilfe :/ bye frank [edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit] |
Re: WaveInOpen - CALLBACK_FUNCTION - Problem
Zitat:
Deklarier' mal die WaveInProc außerhalb der Klasse in der Unit und probier's dann mal. Wenn's klappt, liegt's daran wie Klassen intern verwaltet werden, nämlich selbst als Pointer, wenn nicht, liegt's an was anderem :mrgreen: Ansonsten habe ich nicht geschaut, ob die Parameter von WaveInProc korrekt sind... |
Re: WaveInOpen - CALLBACK_FUNCTION - Problem
whoha vielen dank jetzt gehts
wäre natürlich schöner wenn die function im object liegen könnte .. aber naja gibt es ne möglichkeit die Callback-Routine "ins Object zu legen" Ich mein für den dwCallback Parameter in WaveInOpen steht in der hilfe: Address of a fixed callback function, an event handle, a handle to a window, or the identifier of a thread Address of a fixed callback function .. entfällt ja nun :D a handle to a window .. entfällt auch wie sieht es aus mit threads bzw einem event handle? (kenn mich mit beidem garnich aus) |
Re: WaveInOpen - CALLBACK_FUNCTION - Problem
Zitat:
Windows erwartet "echte" Funktionen als Parameter, da Objekte aber intern Pointer sind, haben sie keine echten Adressen für ihre Methoden, den Windows benutzen könnte. Daher schlägt normalerweise schon der Versuch fehl, einen Pointer auf eine Methode (Funktion oder Prozedur in Objekt) zu benutzen. (Fehlermeldung: "Variable required") Zitat:
selbst abfangen musst (wie in einem nonVCL-Programm), solange der Thread läuft. Ich weiß nicht genau, was du in deiner WaveInProc machen würdest, wenn sie funktionieren würde, aber mit Hilfe von InterlockedExchange, CriticalSections und Pointern wäre das sicherlich eine brauchbare Alternative. Bei einem Event Handle handelt es sich um ein Windows-Event, das zwei Stati hat, entweder "signaled" oder "nonsignaled". Das ganze arbeitet auf Thread-Ebene und dient dazu, einen Thread für eine unbestimmte Zeit auf "Idle" zu zu setzen und automatisch wieder zu wecken. Die Funktion dazu lautet "WaitForSingleObject" und nimmt u.A. ein Event als Parameter auf. Die Funktion ist vom Ergebnis ähnlich wie Sleep(), nur daß auf dieses Event gewartet wird, daß von einem anderen Thread auf "signaled" gesetzt wird. Wie damit irgendwelche Parameter übergeben werden sollen, weiß ich nicht (davon steht auch nix im PSDK). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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