Laden...

WinAPI DllImport Dhcpcsvc.dll DhcpRequestParams

Erstellt von live2 vor 16 Jahren Letzter Beitrag vor 16 Jahren 6.642 Views
L
live2 Themenstarter:in
34 Beiträge seit 2005
vor 16 Jahren
WinAPI DllImport Dhcpcsvc.dll DhcpRequestParams

Hallo Leute ich Versuche seit 2 Tagen vergeblich eine C++ komponente anzuprogrammieren.

Habe mein Script so weit fertig aber bekomme jetzt Fehler wie der folgenden...


Ein Aufruf an die PInvoke-Funktion "WindowsApplication1!WindowsApplication1.Form1::DhcpRequestParams" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

Kennt sich jemand mit so sachen aus??

Würde gerne die Scope Option 66 Abfragen damit kann man den Boot Server den man am DHCP Server einstellt abfragen so weit ich das verstanden habe. Benötige diese Funktion um den optimalisten Software Server zur ermitteln.

Microsoft Dokumentation

hier noch was in VB

Bitte um Hilfe 8o


        const byte DHCPCAPI_REQUEST_PERSISTENT = 0x01;
        const byte DHCPCAPI_REQUEST_SYNCHRONOUS = 0x02;
        const byte DHCPCAPI_REQUEST_ASYNCHRONOUS = 0x04;
        const byte DHCPCAPI_REQUEST_CANCEL = 0x08;
        const byte DHCPCAPI_REQUEST_MASK = 0x0F;

        public struct DHCPCAPI_CLASSID
        {
            public long Flags;
            public byte Data;
            public long nBytesData;
        }

        public struct DHCPAPI_PARAMS
        {
            public long Flags;
            public long OptionId;
            public bool IsVendor;
            public byte Data;
            public long nBytesData;
        }

        public struct DHCPCAPI_PARAMS_ARRAY
        {
            public long nParams;
            public DHCPAPI_PARAMS Params;
        }

        [DllImport("Dhcpcsvc.dll")]
        public static extern int DhcpRequestParams(int Flags, IntPtr Reserved, [MarshalAs(UnmanagedType.LPWStr)] string AdapterName, DHCPCAPI_CLASSID ClassId, DHCPCAPI_PARAMS_ARRAY SendParams, ref DHCPCAPI_PARAMS_ARRAY RecdParams, byte[] Buffer, ref IntPtr pSize, [MarshalAs(UnmanagedType.LPWStr)] string RequestIdStr);

        private void button1_Click(object sender, EventArgs e)
        {
            DHCPCAPI_PARAMS DhcpApiHostNameParams = new DHCPCAPI_PARAMS();
            DhcpApiHostNameParams.Flags = 0;
            DhcpApiHostNameParams.OptionId = 66;
            DhcpApiHostNameParams.IsVendor = false;
            DhcpApiHostNameParams.Data = new byte();
            DhcpApiHostNameParams.nBytesData = 0;

            DHCPCAPI_PARAMS_ARRAY SendParams = new DHCPCAPI_PARAMS_ARRAY();
            SendParams.nParams = 0;
            SendParams.Params = new DHCPCAPI_PARAMS();

            DHCPCAPI_PARAMS_ARRAY RecdParams = new DHCPCAPI_PARAMS_ARRAY();
            RecdParams.nParams = 1;
            RecdParams.Params = DhcpApiHostNameParams;

            IntPtr Reserved = new IntPtr();
            DHCPCAPI_CLASSID ClassId = new DHCPCAPI_CLASSID();
            IntPtr pSize = new IntPtr(1);

            DhcpRequestParams(1, Reserved, "VMWare Accelerated AMD PCNet Adapter", ClassId, SendParams, ref RecdParams, null, ref pSize, "1");
        }

S
8.746 Beiträge seit 2005
vor 16 Jahren

Ohne die zugehörige C-Definition der Funktion und der Strukturen der Parameter kann man dir nicht helfen...

L
live2 Themenstarter:in
34 Beiträge seit 2005
vor 16 Jahren

hab ich doch oben verlinkt 🙁

siehe Microsoft Dokumentation... ???

L
live2 Themenstarter:in
34 Beiträge seit 2005
vor 16 Jahren

Ein wenig weiter bin ich mitlerweile...


public const uint OPTION_HOST_NAME = 12;
public const byte DHCPCAPI_REQUEST_PERSISTENT = 0x01;
public const byte DHCPCAPI_REQUEST_SYNCHRONOUS = 0x02;
public const byte DHCPCAPI_REQUEST_ASYNCHRONOUS = 0x04;
public const byte DHCPCAPI_REQUEST_CANCEL = 0x08;
public const byte DHCPCAPI_REQUEST_MASK = 0x0F;

public struct DHCPCAPI_CLASSID
{
public uint Flags;
public byte Data;
public uint nBytesData;
}

public struct DHCPCAPI_PARAMS
{
public uint Flags;
public uint OptionId;
public bool IsVendor;
public byte Data;
public uint nBytesData;
}

public struct DHCPCAPI_PARAMS_ARRAY
{
public int nParams;
public DHCPCAPI_PARAMS[] Params;
}

[DllImport("Dhcpcsvc.dll";)]
public static extern int DhcpRequestParams(uint Flags, IntPtr Reserved, [MarshalAs(UnmanagedType.LPWStr)] string AdapterName, ref DHCPCAPI_CLASSID ClassId, DHCPCAPI_PARAMS_ARRAY SendParams, ref DHCPCAPI_PARAMS_ARRAY RecdParams, byte[] Buffer, ref IntPtr pSize, [MarshalAs(UnmanagedType.LPWStr)] string RequestIdStr);

private void button1_Click(object sender, EventArgs e)
{


DHCPCAPI_PARAMS DhcpApiHostNameParams = new DHCPCAPI_PARAMS();
DhcpApiHostNameParams.Flags = 0;
DhcpApiHostNameParams.OptionId = OPTION_HOST_NAME;
DhcpApiHostNameParams.IsVendor = false;
DhcpApiHostNameParams.Data = new byte();
DhcpApiHostNameParams.nBytesData = 0;

DHCPCAPI_PARAMS SendParams = new DHCPCAPI_PARAMS();
DhcpApiHostNameParams.Flags = 0;
DhcpApiHostNameParams.OptionId = 0;
DhcpApiHostNameParams.IsVendor = false;
DhcpApiHostNameParams.Data = new byte();
DhcpApiHostNameParams.nBytesData = 0;

DHCPCAPI_PARAMS_ARRAY SendParamsArray = new DHCPCAPI_PARAMS_ARRAY();
SendParamsArray.nParams = 0;
SendParamsArray.Params = new DHCPCAPI_PARAMS[1];
SendParamsArray.Params[0] = SendParams;

DHCPCAPI_PARAMS_ARRAY RecdParamsArray = new DHCPCAPI_PARAMS_ARRAY();
RecdParamsArray.nParams = 1;
RecdParamsArray.Params = new DHCPCAPI_PARAMS[1];
RecdParamsArray.Params[0] = DhcpApiHostNameParams;

IntPtr Reserved = IntPtr.Zero;
DHCPCAPI_CLASSID ClassId = new DHCPCAPI_CLASSID();
IntPtr pSize = new IntPtr(1);

string AdapterName = "{EF2BB926-7ACB-4577-BA27-488FFD2EE4E3}";
//string AdapterName = "VMWare Accelerated AMD PCNet Adapter";

DhcpRequestParams(2, Reserved, AdapterName, ref ClassId, SendParamsArray, ref RecdParamsArray, null, ref pSize, "1";);
}

Neue Fehler Meldung


ArgumentException bei SendParamsArray
Falscher Parameter. (Ausnahme von HRESULT: 0x80070057 (E_INVALIDARG))

230 Beiträge seit 2007
vor 16 Jahren

Hi! 4 Parameter von Deinem struct DHCPAPI_PARAMS: Den hast Du mit Byte deklariert. Laut MSDN ist es aber ein Pointer (LPBYTE), der auf die Daten zeigt. HTH - sarabande

S
8.746 Beiträge seit 2005
vor 16 Jahren

Das Params-Array ist falsch definiert. Erstes Elementes des Structs ist Long, dann folgt ein Pointer auf den Begin eines Arrays.

L
live2 Themenstarter:in
34 Beiträge seit 2005
vor 16 Jahren

@svenson & sarabande

Danke für eure Antworten habe nun probiert das mal umzusetzen.

In DHCPAPI_PARAMS das hoffe ich ist nun richtig.

Aber den Teil im DHCPCAPI_PARAMS_ARRAY kapier ich nicht ganz wie übergebe ich dann das Array?

RecdParamsArray.Params = new DHCPCAPI_PARAMS[1];
RecdParamsArray.Params[0] = DhcpApiHostNameParams;

bekomme bei der jetztigen Version wieder den Fehler


[B]PInvokeStackImbalance wurde erkannt.[/B]
Ein Aufruf an die PInvoke-Funktion "WindowsApplication1!WindowsApplication1.Form1::DhcpRequestParams" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.


        public const uint OPTION_HOST_NAME = 12;
        public const byte DHCPCAPI_REQUEST_PERSISTENT = 0x01;
        public const byte DHCPCAPI_REQUEST_SYNCHRONOUS = 0x02;
        public const byte DHCPCAPI_REQUEST_ASYNCHRONOUS = 0x04;
        public const byte DHCPCAPI_REQUEST_CANCEL = 0x08;
        public const byte DHCPCAPI_REQUEST_MASK = 0x0F;

        public struct DHCPCAPI_CLASSID
        {
            public uint Flags;
            public byte Data;
            public uint nBytesData;
        }

        public struct DHCPCAPI_PARAMS
        {
            public uint Flags;
            public uint OptionId;
            public bool IsVendor;
            public IntPtr Data;
            public uint nBytesData;
        }

        public struct DHCPCAPI_PARAMS_ARRAY
        {
            public long nParams;
            public IntPtr Params;
        }

        [DllImport("Dhcpcsvc.dll")]
        public static extern int DhcpRequestParams(byte Flags, IntPtr Reserved, [MarshalAs(UnmanagedType.LPWStr)] string AdapterName, ref DHCPCAPI_CLASSID ClassId, DHCPCAPI_PARAMS_ARRAY SendParams, ref DHCPCAPI_PARAMS_ARRAY RecdParams, byte[] Buffer, ref IntPtr pSize, [MarshalAs(UnmanagedType.LPWStr)] string RequestIdStr);

        private void button1_Click(object sender, EventArgs e)
        {
            

            DHCPCAPI_PARAMS DhcpApiHostNameParams = new DHCPCAPI_PARAMS();
            DhcpApiHostNameParams.Flags = 0;
            DhcpApiHostNameParams.OptionId = OPTION_HOST_NAME;
            DhcpApiHostNameParams.IsVendor = false;
            DhcpApiHostNameParams.Data = IntPtr.Zero;
            DhcpApiHostNameParams.nBytesData = 0;

            DHCPCAPI_PARAMS_ARRAY SendParamsArray = new DHCPCAPI_PARAMS_ARRAY();
            SendParamsArray.nParams = 0;
            //SendParamsArray.Params = null;
            SendParamsArray.Params = IntPtr.Zero;

            DHCPCAPI_PARAMS_ARRAY RecdParamsArray = new DHCPCAPI_PARAMS_ARRAY();
            RecdParamsArray.nParams = 1;
            RecdParamsArray.Params = new IntPtr(1);
            //RecdParamsArray.Params

            IntPtr Reserved = IntPtr.Zero;

            DHCPCAPI_CLASSID ClassId = new DHCPCAPI_CLASSID();
            ClassId.Flags = 0;
            ClassId.Data = new byte();
            ClassId.nBytesData = 0;

            IntPtr pSize = new IntPtr(1);

            string AdapterName = "{EF2BB926-7ACB-4577-BA27-488FFD2EE4E3}";
            //string AdapterName = "VMWare Accelerated AMD PCNet Adapter";

            DhcpRequestParams(DHCPCAPI_REQUEST_SYNCHRONOUS, Reserved, AdapterName, ref ClassId, SendParamsArray, ref RecdParamsArray, null, ref pSize, "1");

S
8.746 Beiträge seit 2005
vor 16 Jahren
  1. Ohne StructLayoutAttribute über den Strukturen funzt es nicht
  2. Du musst den Speicher für das Array per AllogHGlobal() allokieren und dann die Parametern-Struktur via StructureToPtr() an die richtige Stelle im Speicher einkopieren. Ist also ein bißchen Zeigerarithmetik auf IntPtr

Etwa so:

           DHCPCAPI_PARAMS_ARRAY RecdParamsArray = new DHCPCAPI_PARAMS_ARRAY();
            RecdParamsArray.nParams = 10; // 10 Parameter
            RecdParamsArray.Params = Marshal.AllocHGlobal(RecdParamsArray.nParams * Marshal.SizeOf(DHCPCAPI_PARAMS));
            //RecdParamsArray.Params
           DHCPCAPI_PARAMS[] p = new DHCPCAPI_PARAMS[10];
           // hier Daten der Parameter befüllen
           for(int i = 0; i < p.Length; i++)
           {
               Marshal.StructureToPtr(p[i],RecdParamsArray.Params + ( i * Marshal.SizeOf(DHCPCAPI_PARAMS)),false);
           }

           // usw.
          

          // freigegen nach Aufruf nicht vergessen:

         Marshal.FreeHGlobal(RecdParamsArray.Params);

Einfacher ist es allerdings, wenn die Zahl der Array-Elemente fix ist. Hier marshallt dann .NET wieder automatisch.