Zitat:
Ich würde ernsthaft vorschlagen, die Herangehensweise zu überdenken. Es wäre besser, die ganze Funktionalität in einer komplett nativen Delphi-
DLL zu verpacken, nur die Methoden zu exposen, und ausschliesslich primitive Datentypen zwischendrin auszutauschen. Oder, Du nimmst sowas wie Hydra, das Dir dann wirklich erlaubt komplette Interfaces zwischen .NET und Delphi hin- und her zu schieben, und das ganze Plugin-Framework kümmert sich für Dich dann um das ganze richtige Konvertieren etc.
Würde ich gerne machen wenn es denn meine
DLL wäre.
NA ja die Strings hab ich nach IntPtr gecastet das ist kein Problem.
Das ich mit Strings keine Probleme habe kannst du sehen siehe Anhang.
Delphi-Quellcode:
type
TCoverArtData = packed record
Name: PWideChar;
Data: Pointer;
DataSize: Int64;
Description: PWideChar;
CoverType: DWord;
MIMEType: PWideChar;
PictureFormat: TTagPictureFormat;
Width: DWord;
Height: DWord;
ColorDepth: DWord;
NoOfColors: DWord;
ID3v2TextEncoding: Integer;
Index: Integer;
end;
Code:
[Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
public sealed class TCoverArtData
{
private IntPtr NameSPtr;
public IntPtr Data;
public long DataSize;
private IntPtr DescriptionSPtr;
public int CoverType;
private IntPtr MIMETypeSPtr;
public TTagPictureFormat PictureFormat;
public int Width;
public int Height;
public int ColorDepth;
public int NoOfColors;
public int ID3v2TextEncoding;
public int Index;
public string Name
{
get
{
if (NameSPtr == IntPtr.Zero)
return null;
else
return Marshal.PtrToStringAuto(NameSPtr);
}
set
{
NameSPtr = Marshal.StringToHGlobalAuto(value);
}
}
public string Description
{
get
{
if (DescriptionSPtr == IntPtr.Zero)
return null;
else
return Marshal.PtrToStringAuto(DescriptionSPtr);
}
set
{
DescriptionSPtr = Marshal.StringToHGlobalAuto(value);
}
}
public string MIMEType
{
get
{
if (MIMETypeSPtr == IntPtr.Zero)
return null;
else
return Marshal.PtrToStringAuto(MIMETypeSPtr);
}
set
{
MIMETypeSPtr = Marshal.StringToHGlobalAuto(value);
}
}
}
gruss