Announcement

Collapse
No announcement yet.

RegEnumValue erzeugt System.ExecutionEngineException

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RegEnumValue erzeugt System.ExecutionEngineException

    Moin Zusammen,<br>
    <br>
    bei dem Versuch über RegEnumValue Werte auszulesen schmiert mir das Programm immer mit o.g. Exception ab.<br>
    <br>
    Deklaration der Funktion:<br>
    <pre>
    [DllImport("advapi32.dll",CharSet = CharSet.Auto)]
    public static extern int
    RegEnumValue(
    int hKey,
    int dwIndex,
    [MarshalAs(UnmanagedType.LPTStr)]
    StringBuilder lpValueName,
    ref int lpcValueName,
    int lpReserved,
    ref TcsRegDataTypes lpType,
    ref byte[] lpData,
    ref int lpcbData
    );

    </pre>
    Aufruf:<br>
    <pre>
    sbDummy = new StringBuilder(iValueMaxLenName);
    iWork = TcsRegInfo.RegEnumValue(iRegHandle,i,sbDummy,ref iValueMaxLenName,0,ref rdtWork,ref abBuffer,ref iMaxValueLen);
    </pre>
    <br>
    Folgendes Voraussetzungen bestehen:<br>
    hKey enthält das Handle auf den geöffneten Key<br>
    dwIndex enthält 0<br>
    lpValueName enthält lpcValueName Blanks<br>
    lpcValueName enthält die korrekte Länge + 1 (Reservere)<br>
    lpReserved ist 0<br>
    lpType (TcsRegDataTypes ist ein eigner enum Typ, mit int passiert das gleiche) ist mit $FFFF initialisiert.<br>
    lpData ist mit new byte[lpcData] initialisiert<br>
    lpcData enthält einen korrekten Wert.<br>
    <br>
    Schau ich mir die Inhalte der Variablen nach dem Auftreten der Exception an, so enthalten sie offensichtlich Werte, die von der Funktion zurückgeliefert wurden. lpType enthält z.B. den Wert für REG_EXPAND, wurde also gefüllt.<br>
    iWork wird vor dem Aufruf auf -1 initialisiert und bleibt unverändert.<br>
    <br>
    Hat irgend Jemand eine Idee, woran's liegt?<br>
    <br>
    Ciao<br>
    Chris

  • #2
    Hallo,

    gibt es einen Grund, warum nicht die Klasse <b>RegistryKey</b > aus dem <i>Microsoft.Win32</i>-Namespace verwendet wird? Die Methode <b>GetValueNames</b> sollte das das Gleiche leisten

    Comment


    • #3
      Moin Andreas,<br>
      <br>
      der Grund ist ganz einfach:<br>
      Über die Klasse RegistryKey bekomme ich nicht die Typen ausgelesen.<br>
      Und um die geht's mir hier.<br>
      Mit Hilfe von RegQueryInfoKey die LastWriteTime auszulesen hat ja auch einwandfrei funktioniert, also warum sollte nun gerade RegEnumValue nicht funktionieren?<br>
      Wenn's 'ne Lösung gäbe, die ohne die direkte Nutzung der APIs auskommt, hätte ich auch nichts dagegen.<br>
      Leider konnte ich da bislang nicht fündig werden.<br>
      <br>
      Ciao<br>
      Chri

      Comment


      • #4
        Moin Zusammen,<br>
        <br>
        Fehler gefunden.<br>
        Der lpData Parameter muss anders deklariert werden, so dass die Deklaration wie folgt aussieht:<br>
        <br>
        <pre>
        [DllImport("advapi32.dll",CharSet = CharSet.Auto)]
        public static extern int
        RegEnumValue(
        int hKey, // handle to key to query
        int dwIndex, // index of value to query
        [MarshalAs(UnmanagedType.LPTStr)]
        StringBuilder lpValueName, // value buffer
        ref int lpcValueName, // size of value buffer
        int lpReserved, // reserved
        ref TcsRegDataTypes lpType, // type buffer
        [MarshalAs(UnmanagedType.LPArray)]
        byte[] lpData, // data buffer
        ref int lpcbData // size of data buffer
        );

        </pre>
        <br>
        Ciao<br>
        Chri

        Comment

        Working...
        X