![]() |
Doppeldeutiger Aufruf
Fehler zu bereinigen?
Habe da meine Zweifel da ich nicht in der SysUtils rummachen kann oder? Zitat:
Delphi-Quellcode:
gruss
procedure TMidiOutput.PutLong(TheSysex: Pointer; msgLength: Word);
{ Notes: This works asynchronously } var MyMidiHdr: TMyMidiHdr; begin { Initialize the header and allocate buffer memory } MyMidiHdr := TMyMidiHdr.Create(msgLength); StrMove(MyMidiHdr.SysexPointer, TheSysex, msgLength); { Store the MyMidiHdr address in the header so we can find it again quickly } MyMidiHdr.hdrPointer^.dwUser := DWORD(MyMidiHdr); { Get MMSYSTEM's blessing for this header } FError := midiOutPrepareHeader(FMidiHandle, MyMidiHdr.hdrPointer, sizeof(TMIDIHDR)); if Ferror > 0 then raise EMidiOutputError.Create(MidiIOErrorString(False, FError)); { Send it } FError := midiOutLongMsg(FMidiHandle, MyMidiHdr.hdrPointer, sizeof(TMIDIHDR)); if FError > 0 then raise EMidiOutputError.Create(MidiIOErrorString(False, FError)); end; |
AW: Doppeldeutiger Aufruf
Keine Angst, SysUtils musst Du dafür nicht anfassen :)
Sowohl MyMidiHdr.SysexPointer als auch TheSysex "müssen" beide entweder PAnsiChar oder PWideChar sein, zur Not per typecasting, sonst weiß der Compiler nicht, an welche der beiden überladenen Funktionen er andere Typen am besten übergeben soll. |
AW: Doppeldeutiger Aufruf
Schon mal einen Cast probiert?
Delphi-Quellcode:
StrMove(PWideChar(MyMidiHdr.SysexPointer), PWideChar(TheSysex), msgLength);
// oder eben StrMove(PAnsiChar(MyMidiHdr.SysexPointer), PAnsiChar(TheSysex), msgLength); |
AW: Doppeldeutiger Aufruf
Zitat:
Sind als Pointer deklariert .. Mit s.h.a.r.k seinem cast sollte es gehen. gruss |
AW: Doppeldeutiger Aufruf
Kannst eigentlich auch nur PChar nutzen, dann hast bei "alten" Delphi-Versionen PAnsiChar und bei neueren eben PWideChar.
|
AW: Doppeldeutiger Aufruf
Und bei einem von beiden eben ein Problem?
Welches der drei er nun verwenden kann, hängt komplett davon ab, was TheSysex nun wirklich ist. Zumindest spricht die Delphi-Hilfe von "number of characters" und nicht "number of bytes" - das Verwenden des falschen Typen würde dann entweder nur halbe "Messages" oder einen Speicherüberlauf bedeuten. Da es hier um Rohdaten gehen könnte, wäre das PAnsiChar, und da PChar oder PWideChar unter neuerem Delphi zu verwenden würde heißen, jedesmal doppelt so viel Speicher wie nötig zu kopieren - von unklarer Stelle und in nicht allokiierten Speicher hinein! Wenn es aber nur Daten und keine Texte sind, warum dann eigentlich StrMove und nicht nur Move? |
AW: Doppeldeutiger Aufruf
Zitat:
aber D2009 leider nicht. gruss |
AW: Doppeldeutiger Aufruf
Damals gab es halt nur einen Stringtyp ( eigentlich 2, ist aber für dieses Problem egal). Jetzt gibt es halt 2 verschiedene, da weiss der Compiler dann nicht welcher der richtige ist!
|
AW: Doppeldeutiger Aufruf
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 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