Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagement (https://www.delphipraxis.net/154075-aufruf-von-funktion-mit-parametern-aus-pchar-missverstehe-leider-speichermanagement.html)

Der_Ventilator 26. Aug 2010 18:30

Delphi-Version: 2010

Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagement
 
Hallo.

Ich möchte folgende Funktion benutzen:


Delphi-Quellcode:
function TBASSPlayer.GetLyrics(Artist, Title : string; CheckTitleMatch : boolean;
                var pLyrics : pchar; var lLyrics : integer) : boolean;
Nun habe ich gelesen (http://www.michael-puff.de/Artikel/StringDLL.shtml) wie man das mit DLLs und PChar Zeigern macht und versucht umzusetzen:

Delphi-Quellcode:

var plyrics : pchar;
    ilyrics : integer;

begin

//Hole mir ilyrics um Länge des Strings festzustellen
 spieler.BassPlayer1.GetLyrics(id3info.Artist,id3info.Titel,false,nil,Ilyrics);

//Reserviere den Speicher
 GetMem(plyrics,ilyrics+1);

//Hole mir die Lyrics
 spieler.BassPlayer1.GetLyrics(id3info.Artist,id3info.Titel,false,plyrics,ilyrics);


 showmessage(string(plyrics));
Leider bricht schon bei der ersten Zeile der Compiler ab.
Zitat:

[DCC Fehler] ump3.pas(4573): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Wie geht das mit den PChar-Zeigern?
Artist und Titel sind natürlich strings.
Ist nil kein Pchar kompatibler "Datentyp"?

Ist bestimmt einfach, verstehe es leider noch nicht. Danke.

jfheins 26. Aug 2010 19:06

AW: Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagem
 
Zitat:

Zitat von Der_Ventilator (Beitrag 1045345)
Wie geht das mit den PChar-Zeigern?
Artist und Titel sind natürlich strings.
Ist nil kein Pchar kompatibler "Datentyp"?

Ist bestimmt einfach, verstehe es leider noch nicht. Danke.

Schon, aber es wird nicht nach einem PChar verlangt, sondern nach einer Variable vom Typ PChar. Und nil ist eben eine Konstante ;)
Lösung: Eine Variable übergeben.

Der_Ventilator 26. Aug 2010 22:29

AW: Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagem
 
Hm, wenn ich aber einen leeren PChar übergebe, beschwert er sich auch mit einer Exception:

---------------------------
---------------------------
Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.
---------------------------
OK
---------------------------

mkinzler 27. Aug 2010 05:26

AW: Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagem
 
Was meinst du mit leeren PChar?
(PChar('') oder Nil)

Bernhard Geyer 27. Aug 2010 06:25

AW: Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagem
 
Delphi 2010 und Bass.DLL? Hast du denn ein Unicodefähige Bass-DLL?
Falls nein sind alle Funktiondefinitionen von PChar auf PAnsiChar zu ändern!

himitsu 27. Aug 2010 09:26

AW: Aufruf von Funktion mit Parametern aus PChar: Missverstehe leider Speichermanagem
 
Soeine Abfrage nur, wenn die Prozedur auch dafür vorgesehn ist.

Oftmals geht sowas nicht und man muß entweder die nötige Länge über eine andere Funktion (ala GetLyricsLength o.Ä.) auslesen
und bei Anderen muß man die Variable auf eine bestimmte maximal zu erwartende Länge vorbelegen und danach dann kürzen.
Und nur manchmal kann man es ala
Delphi-Quellcode:
procedure TheProc(data: PChar: len: Integer): Integer;

i := TheProc(nil, 0);
P := GetMem(i);
TheProc(P, i);
machen.
Du aber übergibst einfach so NIL, und in ilyrics einfach so irgendeinen unbestimmten/zufälligen Wert.



Ich würde es also erstmal so probieren:
Delphi-Quellcode:
plyrics := nil;
ilyrics := 0;
spieler.BassPlayer1.GetLyrics(id3info.Artist,id3info.Titel,false,plyrics,Ilyrics);
GetMem(plyrics,ilyrics+1);
spieler.BassPlayer1.GetLyrics(id3info.Artist,id3info.Titel,false,plyrics,ilyrics);
FreeMem(plyrics);


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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