Laden...

DLLImport und in einem Struct ein CharArray definieren und auslesen

Erstellt von raneu vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.490 Views
R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 13 Jahren
DLLImport und in einem Struct ein CharArray definieren und auslesen

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.

S
248 Beiträge seit 2008
vor 13 Jahren

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

R
raneu Themenstarter:in
65 Beiträge seit 2005
vor 13 Jahren

Einfach nur perfekt 👍

Danke dir vielmals.