Hi,
ich hab da ein Problem und komm wirlich nicht weiter:
Also folgende Voraussetzung:
Ich habe eine sender.dll in derer Header Datei sender.h ist folgender struct definiert
struct SenderType {
char name[50];
short SenderId;
};
In der Interface Beschreibung ist die Methode folgendermaßen beschrieben:
RESULT GetSenderInfo(short SenderId, SenderType FAR *SenderStruct)
Parameters: SenderId – local sender id
SenderStruct – pointer to existing info structure.
Return: Sender_OK
In meinem C# project habe ich eine Class erstellt in der die Funktionen der Sender.dll eingenunden werden mit folgendem Code un dem dazugehören struct:
public struct SenderType
{
char[] name;
short SenderId;
public SenderType(char InitName, short InitSenderID)
{
name = new char[50];
CenterId = InitCenterID;
}
}
[DllImport("Sender", CharSet = CharSet.Ansi)]
public static extern short GetSenderInfo(short CenterId, ref CenterType centerInfo);
Zum abrufen der senderinfo benutze ich folgenden code:
SenderType st = new SenderType();
short u = Sender.GetSenderInfo(0, ref st);
Wenn ich den Code ausführe bekomm ich eine exception:
SystemAccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrpt
Folgende Info noch:
Wenn ich den struct folgendermaßen ändere bekomme ich werte für "st".
public struct SenderType
{
char name;
short SenderId;
public SenderType(char InitName, short InitSenderID)
{
name = InitName;
CenterId = InitCenterID;
}
}
Die SenderID vom Typ short und als name nur den ersten Buchstaben vom kompletten Namen. Also muss irgend wie den Namen als array machen.
ABER WIE????
Wenn ich den Methodenaufruf OHNE ref mache ist das Ergebnis null
Danke schon mal für eure Hilfe.
Hallo,
ich würde die Struct so deklarieren:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct SenderType
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
string name;
short SenderId;
}
Der Marshaller übernimmt das umwandeln in das inline Array und die Konvertierung von Unicode nach Ansi und du kannst trotzdem wie gewohnt einen string verwenden.
Nach der Änderung sollte es auch mit der Verwendung von ref klappen.
spooky