Entwickler-Ecke
Basistechnologien - Allgemeiner Typ für struct
Delete - Do 13.09.18 07:30
Titel: Allgemeiner Typ für struct
- Nachträglich durch die Entwickler-Ecke gelöscht -
OlafSt - Do 13.09.18 07:42
Ein Generic geht nicht ?
Delete - Do 13.09.18 08:45
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Do 13.09.18 09:16
Nein, die Klasse muß nicht zwangsläufig generisch sein.
Was meinst du aber jetzt mit "untypisierter Zeiger (void*)"? Zeige mal am besten ein Beispiel.
OlafSt - Do 13.09.18 09:26
Eine generische Klasse braucht es nicht. Eine List<T>, später als List<integer> instanziiert, hat auch keinen generischen Integer ;)
Delete - Do 13.09.18 13:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Do 13.09.18 14:48
Einfach so:
C#-Quelltext
1: 2:
| [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern bool SendMsgB<T>(IntPtr hWnd, int Msg, int wParam, ref T lParam) where T : struct; |
Und der Aufruf dazu:
C#-Quelltext
1: 2: 3: 4:
| public static bool capDriverGetCaps(IntPtr hwnd, ref CAPDRIVERCAPS psCaps, int wSize) { return SendMsgB(hwnd, WM_CAP_DRIVER_GET_CAPS, wSize, ref psCaps); } |
s.a.
Ideone-Code [
https://ideone.com/5YhQVK] (wobei dabei
DllImportAttribute sowie
CAPDRIVERCAPS nur Fakes sind).
Delete - Fr 14.09.18 00:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
Delete - Fr 14.09.18 20:38
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Sa 15.09.18 07:53
Ja stimmt, zumindestens wenn es auch ein Input-Parameter sein soll. Bei
capDriverGetCaps bin ich jedoch von einem reinen Output(
out)-Parameter ausgegangen.
Aber als generelle Methode sicherlich empfehlenswert.
Du könntest aber jetzt einfach 2 verschiedene generische Methoden anbieten, einmal mit
ref und einmal mit
out:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public static bool SendMsgRef<T>(IntPtr hwnd, int msg, ref T param) where T : struct { int wSize = Marshal.SizeOf(param); IntPtr hMem = Marshal.AllocHGlobal(wSize); Marshal.StructureToPtr(param, hMem, true); bool result = SendMsgB(hwnd, msg, wSize, hMem); param = (T)Marshal.PtrToStructure(hMem, typeof(T));
Marshal.FreeHGlobal(hMem);
return result; }
public static bool SendMsgOut<T>(IntPtr hwnd, int msg, out T param) where T : struct { } |
Delete - Sa 15.09.18 21:11
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!