Forum: PC-Programmierung C Struktur in DLL Funktion


von coder (Gast)


Lesenswert?

Hallo, in einer DLL Funktion soll eine Struktur mit Daten befüllt und 
diese soll danach per Pointer in eine C# Anwendung zur Verfügung 
gestellt werden.
Wie könnte eine mögliche Lösung hierfür aussehen?
1
// Deklaration der Struktur Data
2
struct Data
3
{
4
  uint8_t x;
5
  uint16_t y;
6
  uint32_t width;
7
  uint32_t height;
8
};
9
10
Data pData[5];
11
12
13
for (int i = 0; i < 5; i++)
14
{
15
 pData[i].x = 254;
16
 pData[i].y = 0x1234;
17
 pData[i].width = 0x12345678;
18
 pData[i].height = 0xB234567A;
19
}

von Peter II (Gast)


Lesenswert?


von coder (Gast)


Lesenswert?

Vielen Dank für den Link. Ich kann da leider nichts finden wo mir bei 
meinem Problem weiterhelfen könnte. Mit einer eindimensionalen Struktur 
funktioniert die Rückgabe. Wenn ich nun mehrere Instanzen von der 
Struktur anlege und diese übergebe funktioniert die Rückgabe nicht.

von coder (Gast)


Lesenswert?

1
typedef int(__stdcall* CallbackRead)(int length, void *pData);
1
[StructLayout(LayoutKind.Sequential)]
2
public struct Data
3
{
4
 char x;
5
 UInt16 y;
6
 UInt32 width;
7
 UInt32 height;
8
};
9
10
public delegate int CallbackDelegate(int length, ref Data pData);
11
12
private int onCallback(int length, ref Data pData)
13
{
14
  return 0;
15
}

von coder (Gast)


Lesenswert?

Das obige Beispiel funktioniert. Nur mit einem Array von Typ dieser 
Struktur funktioniert das nicht.

von coder (Gast)


Lesenswert?

// Implementierung in C
1
struct Data
2
{
3
  uint8_t x;
4
  uint16_t y;
5
  uint32_t width;
6
  uint32_t height;
7
};
8
9
typedef int(__stdcall* CallbackRead)(int length, void *pData);
10
11
__declspec(dllexport) int __stdcall Read(CallbackRead clbFunctionRead, void* handle)
12
{
13
 int Len = 0;
14
15
 Data pData[5];
16
 for (int i = 0; i < 5; i++)
17
 {
18
   pData[i].x = 254;
19
   pData[i].y = 0x1234;
20
   pData[i].width = 0x12345678;
21
   pData[i].height = 0xB234567A;
22
 }
23
 clbFunctionRead(Len, pData);
24
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.