Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probelm WideString nach PChar (https://www.delphipraxis.net/128308-probelm-widestring-nach-pchar.html)

ichbin007 27. Jan 2009 17:38


Probelm WideString nach PChar
 
Hallo, ich bin neu hier und habe auch grade mit Delphi angefangen.
Ich versuche grade über das iTunes SDK den Namen des Gradegespielten Songs abzufragen, das geht auch soweit.
Das ganze soll jetzt aber in eine DLL.

Hier mal mein Code

Delphi-Quellcode:
library dll;
uses
  SysUtils, iTunesLib_TLB, Classes;

var
  Track: IITTrack;

function Get_CurrentTrack():Pchar; stdcall;
var
  iTunesApp: IiTunes;
begin
  iTunesApp := COiTunesApp.Create;
  Track := iTunesApp.Get_CurrentTrack;
  iTunesApp := nil;
  Result := Track.Name;
end;

exports
  Get_CurrentTrack index 1;

begin
end.
Mein Problem ist jetzt das Track.Name ein WideString ist aber ich das ganze in einem Pchar brauche !
Geht sowas ?

Danke im Vorraus

mfg

ichbin007

[edit=mkinzler]Für Delphicode ist der Delphi-Tag besser geeignet Mfg, mkinzler[/edit]

mkinzler 27. Jan 2009 17:45

Re: Probelm WideString nach PChar
 
Welche Delphi Version?

Delphi-Quellcode:
Result := PChar(Track.Name);

ichbin007 27. Jan 2009 17:47

Re: Probelm WideString nach PChar
 
Jo das habe ich auch schon Versucht, wenn ich die DLL dann aber in dem anderen Programm verwende (ist kein Delphi Projekt) dann bekomme ich nur das erste Zeichen zurück.

mfg

ichbin007

shmia 27. Jan 2009 17:55

Re: Probelm WideString nach PChar
 
Hier mal eine unsaubere Lösung:
Delphi-Quellcode:
library dll;
uses
  SysUtils, iTunesLib_TLB, Classes;
var
  Track: IITTrack;
  CurrentTrackName : AnsiString; // *
function Get_CurrentTrack():Pchar; stdcall;
var
  iTunesApp: IiTunes;
begin
  iTunesApp := COiTunesApp.Create;
  Track := iTunesApp.Get_CurrentTrack;
  iTunesApp := nil;
  CurrentTrackName := Track.Name; // Delphi wandelt automatisch von Widestring nach AnsiString
  Result := PChar(CurrentTrackName);
end;
Unschön ist jetzt, dass ein globale Variable (*) benötigt wird, um den Speicherplatz für den String dauerhaft zu halten.
Angenommen, Get_CurrentTrack() wird zweimal nacheinander aufgerufen.
Dann ist der 1. PChar nicht mehr gültig, weil die Variable CurrentTrackName einen neuen Inhalt hat.

Wenn man's richtig machen möchte, dann muss der Aufrufer den Speicherplatz bereithalten:
Delphi-Quellcode:
function Get_CurrentTrack(trackname:PChar; size:integer):integer; stdcall;
var
  iTunesApp: IiTunes;
  tmp : string;
begin
  iTunesApp := COiTunesApp.Create;
  Track := iTunesApp.Get_CurrentTrack;
  iTunesApp := nil;
  tmp := Track.Name; // Delphi wandelt automatisch von Widestring nach AnsiString
  result := Length(tmp) +1; // benötigter Speicherplatz zurückgeben
  if trackname <> nil then
     StrLCopy(trackname, PChar(tmp), size); // Daten kopieren
end;

ichbin007 27. Jan 2009 18:08

Re: Probelm WideString nach PChar
 
Danke, shima !
Leider kann ich nicht bei jedem aufruf die Länge des ganzen Wissen daswegen ist die erste Methode wohl die die ich nehmen muss, auch wenn dabei Speicherrückstände im RAM bleiben.

Würde es nicht Möglich sein eine Funktion zu schreiben welche die Variablen "Löscht" ?


mfg

ichbin007

mkinzler 27. Jan 2009 18:11

Re: Probelm WideString nach PChar
 
Nein, weil der Speicherplatz ja beim Laden der Dll reserviert ist. Du müsstest den Speicherbereich vor de Zurückgeben dynmaicsh allokieren, dann könntest du eine Aufräumfunktion dafür anbieten. Da der Benutzer diese aber Aufrufen muss, kann er auch gleich den Speicher selber anfordern und an die Funktion übergeben

ichbin007 27. Jan 2009 18:35

Re: Probelm WideString nach PChar
 
Ok das werde ich hinbekomme danke.

Ich habe noch eine Frage habe ich, ich möchte jetzt den Speicher-Ord des Gespielten Songs ermitteln, wie kann ich das am Besten machen.

Danke im Vorraus


mfg

ichbin007

mkinzler 27. Jan 2009 18:45

Re: Probelm WideString nach PChar
 
Ich kenne die Struktur, die Hinter de Interface IITTrack steckt nicht, aber wenn es möglich ist sollte es darüber möglich sein.

ichbin007 27. Jan 2009 18:51

Re: Probelm WideString nach PChar
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Problem was ich habe ist das ich hier mit:
iTunesApp := COiTunesApp.Create;

Nur ein IIITrack erstellen kann für den Pfad der datei brauch ich aber ein IITFileOrCDTrack nur weiß ich nicht wie ich das erstellen kann.

Im Anhang ist die Struktur davon.

Danke im Vorraus

mfg

ichbin007

mkinzler 27. Jan 2009 19:06

Re: Probelm WideString nach PChar
 
IITFileOrCDTrack ist ja von IITtack abgeleitet. Sollte mit eine Cast abfragbar sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.
Seite 1 von 2  1 2      

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