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.
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");
}
Ohne die zugehörige C-Definition der Funktion und der Strukturen der Parameter kann man dir nicht helfen...
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))
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
Das Params-Array ist falsch definiert. Erstes Elementes des Structs ist Long, dann folgt ein Pointer auf den Begin eines Arrays.
@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");
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.