Hallo zusammen,
ich beschäftige mich erst seit kurzem gezwungenermaßen mit DLLImport und habe nun ein Problem.
Grundlegend möchte ich die Methoden
WlanHostedNetworkQueryProperty und
WlanHostedNetworkQueryStatus aus der Wlanapi.dll verwenden. Diese Methoden exisitieren erst ab Windows 7.
Alle weiteren Funktionen aus dem Bereich HostedNetwork habe ich bereits zum Laufen gebracht, es hapert nur an diesen beiden hier. Leider sind die Definitionen für diese Methoden deshalb auch etwas komplizierter.
Hier erst mal kurz die Definitionen in C++:
WlanHostedNetworkQueryProperty:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| DWORD WINAPI WlanHostedNetworkQueryProperty( __in HANDLE hClientHandle, __in WLAN_HOSTED_NETWORK_OPCODE OpCode, __out PDWORD pdwDataSize, __out PVOID *ppvData, __out PWLAN_OPCODE_VALUE_TYPE *pWlanOpcodeValueType, __reserved PVOID pvReserved ); |
WlanHostedNetworkQueryStatus:
Quelltext
1: 2: 3: 4: 5:
| DWORD WINAPI WlanHostedNetworkQueryStatus( __in HANDLE hClientHandle, __out PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus, __reserved PVOID pvReserved ); |
Weitere Informationen zu den dort verwendeten Structs gibts unter den Links in der MSDN.
Zu QueryProperty muss ich noch eine Besonderheit erwähnen: Der übergebene Parameter OpCode bestimmt, welche Daten zurück gegeben werden sollen. Wähle ich ihn so, dass nur ein bool zurück kommt geht alles, soll allerdings ein Struct gelifert werden, so steht in dem Struct nachher nur Müll.
Weiterhin liefert die Funktion den Wert 1734 zurück, also "The array bounds are invalid.". Dazu aber später mehr.
So, nun kommen wir zu meinen bisherigen Versuchen bezüglich der Definition des Prototyps und der notwendigen Structs und Enums.
Prinzipiell habe ich alle Structs und Enums von
hier.
Leider gibt es dort genau die gesuchte Funktion QueryProperty nicht... Die musste ich mir selbst zusammenbauen.
Ich poste hier nur kurz meine Definition, im Anhang gibts das komplette Projekt, auch mit allen Structs und Enums.
Mein Versuch:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| [DllImport("Wlanapi.dll", EntryPoint = "WlanHostedNetworkQueryProperty")] unsafe internal static extern uint WlanHostedNetworkQueryProperty( IntPtr hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, out uint pdwDataSize, [Out]out void* ppvData, [Out]out WLAN_OPCODE_VALUE_TYPE* pWlanOpcodeValueType, IntPtr pvReserved ); |
Weiterer Versuch:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| [DllImport("Wlanapi.dll", EntryPoint = "WlanHostedNetworkQueryProperty")] internal static extern uint WlanHostedNetworkQueryProperty( IntPtr hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, [Out] out uint pdwDataSize, [Out] out IntPtr ppvData, [Out] out WLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType, IntPtr pReserved ); |
Beide Versionen funktionieren für das Auslesen eines Bools, liefern jedoch unterschiedliche Daten für die Structs (beide Male eher Müll).
Umwandlung der Pointer in ein Struct läuft so:
C#-Quelltext
1: 2: 3: 4:
| private static T MarshalToStruct<T>(IntPtr buf) { return (T)Marshal.PtrToStructure(buf, typeof(T)); } |
Ich bin wirklich verzweifelt und hoffe mir kann hier jemand helfen...
Ich frage normalerweise ungern so um kompletten Code, aber ich habe einfach keine andere Idee mehr...
Wer Windows 7 hat, kann auch das Testprogramm aus dem Anhang starten und in die Methode
HostedNetworkController.GetStaus() reindebuggen. Dazu einfach dort einen Breakpoint setzen und inder Form auf TestStatus klicken.
Die anderen müssen sich wohl mit dem bloßen Anblick begnügen müssen
Vielen Dank schonmal im Voraus
Fabi
Crosspostings: