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;