Etwas wichtiges hab ich noch vergessen, der Fehler tritt erst auf, wenn ich die Funktion in der
dll verlasse.
Mein Code ist noch etwas chaotisch, er ist erst in der Testphase und noch sehr hardcoded und ein wenig "um die Ecke" programmiert, aber wenn es hilft:
Delphi-Quellcode:
type
mp3TAG = packed record
PRIV: AnsiString;
TALB: AnsiString; // noch nicht fertig
TIT2: AnsiString; // noch nicht fertig
TPE1: AnsiString; // noch nicht fertig
TRCK: AnsiString; // noch nicht fertig
Version: ShortString;
end;
procedure ReadMP3Tagv23(FilePath: AnsiString; var TAGv2: mp3TAG); stdcall;
const
CheckTAG = 'ID3';
var
temp: Byte;
Stemp: array[0..2] of Char;
version: array[0..1] of Byte;
ID: array[0..3] of Char;
flags: array[0..7] of Boolean; // [1] = Extended Header
Size: Integer;
temp4Byte: array[0..3] of Byte;
tempA: AnsiString;
begin
FreeAndNil(TAGv2);
Stream:= TFileStream.Create(FilePath, fmOpenRead, fmShareDenyWrite);
Stream.Position:= $0;
Stream.ReadBuffer(Stemp, 3);
TAGv2.Version:= Stemp;
if not (Stemp = CheckTag) then begin
raise ENoTAG.Create(Stemp);
FreeAndNil(Stream);
Exit;
end;
Stream.ReadBuffer(version, 2);
TAGv2.Version:= TAGv2.Version + 'v2.' + IntToStr(version[0]) + '.' +
IntToStr(version[1]);
if not (version[0] = 3) then begin
FreeAndNil(Stream);
Exit;
end;
Stream.ReadBuffer(temp, 1);
SplitByte(temp, flags);
if flags[0] then Exit;
if flags[2] then Exit;
Stream.ReadBuffer(temp4Byte, 4);
Size:= MakeInteger(temp4Byte);
if flags[1] then ReadExtendedHeader;
Stream.ReadBuffer(ID, 4);
if ID = 'TIT2' then begin
TIT2(tempA);
TAGv2.TIT2:= tempA;
end;
end;
Außerdem weiss ich wie man
dll's debuggt, das half mir aber auch nicht.