Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Doppeldeutiger Aufruf (https://www.delphipraxis.net/161103-doppeldeutiger-aufruf.html)

EWeiss 16. Jun 2011 16:31

Doppeldeutiger Aufruf
 
Fehler zu bereinigen?
Habe da meine Zweifel da ich nicht in der SysUtils rummachen kann oder?

Zitat:

[DCC Fehler] MidiOut.pas(268): E2251 Doppeldeutiger überladener Aufruf von 'StrMove'
SysUtils.pas(7723): Verwandet Methode: function StrMove(PAnsiChar; const PAnsiChar; Cardinal): PAnsiChar;
SysUtils.pas(7729): Verwandet Methode: function StrMove(PWideChar; const PWideChar; Cardinal): PWideChar;
Delphi-Quellcode:
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;
gruss

CCRDude 16. Jun 2011 16:36

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.

s.h.a.r.k 16. Jun 2011 16:36

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);

EWeiss 16. Jun 2011 16:40

AW: Doppeldeutiger Aufruf
 
Zitat:

Zitat von CCRDude (Beitrag 1106836)
Warum solltest Du dafür etwas in den SysUtils machen müssen?

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.

Ok das erklärt einiges ;)
Sind als Pointer deklariert ..
Mit s.h.a.r.k seinem cast sollte es gehen.

gruss

s.h.a.r.k 16. Jun 2011 16:41

AW: Doppeldeutiger Aufruf
 
Kannst eigentlich auch nur PChar nutzen, dann hast bei "alten" Delphi-Versionen PAnsiChar und bei neueren eben PWideChar.

CCRDude 16. Jun 2011 16:46

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?

EWeiss 16. Jun 2011 17:03

AW: Doppeldeutiger Aufruf
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1106839)
Kannst eigentlich auch nur PChar nutzen, dann hast bei "alten" Delphi-Versionen PAnsiChar und bei neueren eben PWideChar.

Wobei aber D2005 den Pointer aktzeptiert muss da nichts casten.
aber D2009 leider nicht.

gruss

mkinzler 16. Jun 2011 17:06

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!

EWeiss 16. Jun 2011 17:07

AW: Doppeldeutiger Aufruf
 
Zitat:

Zitat von mkinzler (Beitrag 1106844)
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!

Ok Danke euch!

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz