Quote from "all-finder"
- UInt32[] tmpA = new UInt32[i];
- rvalue = DeviceIoControlProperties(hPort, CANElements.IOCTL_CAN_READ_PROPERTIES, 0, 0, out tmpA, Marshal.SizeOf(tmpA), out ReturnedBytes, IntPtr.Zero);
war bis 1024 nicht erfolgreich
Vermutlich weil Sie einen Denkfehler machen. Ein .NET-Array hat solange die Länge Null, bis Werte eingetragen werden. So haben Sie trotz unterschiedlich deklariertem Array dennoch mit Marshal.SizeOf(tmpA) immer den gleichen Längenwert an die Funktion übergeben, nämlich 0. Lassen Sie sich diesen Wert doch mal vor dem Aufruf ausgeben, und Sie werden sehen, dass sie eben *nicht* Werte bis 1024 durchprobiert haben.
Der interne Code ist leider so geschrieben, dass die Anzahl genau passen muss. Das Array darf also auch zu groß sein.
Dass ich Ihnen hier nicht einfach eine Zahl nenne, liegt daran, dass es nicht ganz leicht ist, diese Zahl zu ermitteln, da Sie auch in meinem Code relativ kompliziert berechnet wird. Da tauchen die Längen von Feldern und Enumerations auf, die Längen von Teilarrays werden dann aufsummiert, usw. Das alles ist nicht ganz so leicht nachzuvollziehen und zusammenzusuchen. Da erscheint es mir einfacher, dass Sie schnell eine Schleife programmieren und es kurz ausprobieren.
Mit freundlichen Grüßen,
H. Keller