none
C# C++ Wrapper WlanSetPsdIEDataList RRS feed

  • Frage

  • Hallo,

    ich versuche für einen kleine Test die native WlanApi über C# anzusprechen was soweit auch gut klappt. Ein Problem habe ich mit dieser Funktion WlanSetPsdIEDataList ich bekomme immer ein ERROR_INVALID_PARAMETER zurück.

    Hier auch mein Code

    [DllImport("Wlanapi.dll", EntryPoint = "WlanSetPsdIEDataList")]
    public static extern int WlanSetPsdIEDataList([In] IntPtr hClientHandle, [In] [MarshalAs(UnmanagedType.LPWStr)] string strFormat, [In] IntPtr pPsdIEDataList, [In, Out] IntPtr pReserved);
    
    public struct WLAN_RAW_DATA_LIST
    {
        public uint dwTotalSize;
        public uint dwNumberOfItems;
        public WLAN_RAW_DATA_HEADER DataHeaders;
        public IntPtr DataBlob;
    }
    
    public struct WLAN_RAW_DATA_HEADER
    {
        public uint dwDataOffset;
        public uint dwDataSize;
    }
    
    public static WLAN_RAW_DATA_LIST CreateRawDataList(byte[] datas)
    {
        var list = new WLAN_RAW_DATA_LIST() { DataHeaders = new WLAN_RAW_DATA_HEADER() };
        list.dwTotalSize = (uint)(datas.Length + 16);
        list.dwNumberOfItems = 1;
        list.DataHeaders.dwDataOffset = 16;
        list.DataHeaders.dwDataSize = (uint)datas.Length;
    
        list.DataBlob = Marshal.AllocHGlobal(datas.Length);
        Marshal.Copy(datas, 0, list.DataBlob, datas.Length);
    
        return list;
    }
    
    static void AddIes()
    {
        var ieData = new byte[] { 0xdd, 0x0c, 0x00, 0x50, 0xf2, 0x04, 0xCF, 0xF1, 0x64, 0x17, 0x01, 0x02, 0x03, 0x04 };
        var rawList = WinApi.CreateRawDataList(ieData);
        var rawdata = Marshal.AllocHGlobal(Marshal.SizeOf(rawList));
        Marshal.StructureToPtr(rawList, rawdata, false);
        IntPtr pRes = IntPtr.Zero;
        var num = WinApi.WlanSetPsdIEDataList(_hClient, null, rawdata, pRes);
    
        if (num == _success)
        {
            //Wird nicht erreicht. 
        }
    }

    WlanOpenHandle rufe ich schon vorher ohne Probleme auf _hClient ist eine statische Variable 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Montag, 29. Juli 2019 23:43

Alle Antworten

  • Hallo Thomas,

    Würdest Du Sequential als Strukturlayout festlegen? Gegebenenfalls muss auch ANSI als Zeichensatz angegeben werden:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    

    Eine andere Herangehensweise, wenn die obige nichts daran ändert, wäre die Struktur mit ref als Parameter zu übergeben, wie die Struktur STARTUPINFO in diesem Blogeintrag:
    Accessing CreateProcess from C# and VB.NET

    [DllImport("Wlanapi.dll", EntryPoint = "WlanSetPsdIEDataList")]
    public static extern int WlanSetPsdIEDataList([In] IntPtr hClientHandle, [In] [MarshalAs(UnmanagedType.LPWStr)] string strFormat, [In] ref WLAN_RAW_DATA_LIST pPsdIEDataList, [In, Out] IntPtr pReserved);

    Dort gibt es jedoch keine verschachtelte Struktur im Unterschied zu Deinem Codeausschnitt. Für die verschachtelte Struktur könnte sich IntPtr eignen, wie in folgendem Thread:
    Marshalling nested struct between C# and C - Simple HelloWorld

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 30. Juli 2019 21:44
    Moderator
  • Hallo Dimitar,

    habe ich mittlerweile alles durchprobiert.

    Ich habe eine weiter gute Seite in den MS Docs gefunden Marshallen von Klassen, Strukturen und Unions

    Leider alles ohne Erfolg.

    Weißt Du vielleicht wie man diese Struktur in C++ erstellen würde?


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Mittwoch, 31. Juli 2019 13:07
  • Hallo Thomas,

    Weißt Du vielleicht wie man diese Struktur in C++ erstellen würde?

    Da Du die Erstellung dieser Struktur in C++ noch am darauffolgenden Tag bewerkstelligt hast, möchte ich hier der Übersichtlichkeit halber den anderen Thread mit der Lösung verlinken:
    Struct WLAN_RAW_DATA_LIST erzeugen

    Ich habe die WLAN_RAW_DATA_LIST-Struktur weder in verwaltetem, noch in unverwaltetem Code verwendet.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 14. August 2019 12:48
    Moderator
  • Hallo Dimitar,

    danke für deine Hilfe.

    Ja in C++ habe ich es irgendwann mal hinbekommen. Ich füge gleich noch den Code hinzu. In C# habe ich es dennoch nicht hinbekommen. Da es aber auch nicht das ist was ich gesucht habe, habe ich die lust daran verloren und ohne Lust erreicht man in der C++ Welt nix :). Der einstieg für eine C# Entwickler in C++ ist echt hart. Ist so als würde ein Deutscher polnisch lernen müssen


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings



    Donnerstag, 15. August 2019 22:49