Announcement

Collapse
No announcement yet.

DLLImport / Probleme mit ref

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

  • DLLImport / Probleme mit ref

    Moin Zusammen,<br>
    <br>
    ich möchte die Funktion RegQueryInfoKey aus der advapi32.dll verwenden, da ich ansonsten keinen Ersatz ausmachen konnte (z.B. für die LastWriteTime).<br>
    <br>
    Das ganze habe ich dann innerhalb einer Klasse wie folgt deklariert:<br>
    <br>
    <pre>
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    public static extern int
    RegQueryInfoKey(
    int hKey,
    [MarshalAs(UnmanagedType.LPTStr)]
    ref string lpClass,
    ref int lpcClass,
    ref int lpReserved,
    ref int lpcSubKeys,
    ref int lpcMaxSubKeyLen,
    ref int lpcMaxClassLen,
    ref int lpcValues,
    ref int lpcMaxValueNameLen,
    ref int lpcMaxValueLen,
    ref int lpcbSecurityDescriptor,
    ref FILETIME lpftLastWriteTime
    );
    </pre>
    <br>
    Gemäss einer Doku, die ich bei MS gefunden habe sollte das auch so gehen.<br>
    Leider stosse ich beim Aufruf der Funktion auf verschiedene Probleme:<br>
    Da ich, für den konkreten Anwendungsfall, nur wenige der Werte benötige, gedachte ich null bzw. 0 für die entsprechenden Stellen zu übergeben. Da dies nicht funktionierte ('typ' kann nicht zu 'ref typ' konvertiert werden... Tolle Fehlermeldung, warum nicht? ) hab' ich mir versucht mit Dummy Variablen der entsprechenden Typen weiterzuhelfen. Gleicher Fehler.<br>
    Weiss jemand, was ich da falsch mache, bzw. wie ich auch null übergeben kann?<br>
    <br>
    Ciao<br>
    Chris

  • #2
    Moin Zusammen,<br>
    <br>
    inzwischen kann ich die Frage leicht abwandeln.<br>
    Ein Problem mit der Übergabe hat sich jetzt geklärt:<br>
    Ich hatte schlicht vergessen beim Aufruf der Funktion ebenfalls ref mit anzugeben ops:<br>
    Nachdem ich nun den Paramter lpReserved nicht mehr als ref deklariert habe, so dass ich 0 übergeben konnte, funktioniert der Aufruf auch als solcher.<br>
    <br>
    Bleibt die Frage:<br>
    Wie kann ich ich, wenn's denn überhaupt geht, ref deklarierte Parameter als 0 bzw. null übergeben?<br>
    In diesem speziellen Falle ist das zwar nicht entscheidend, allerdings gibt's ja auch APIs, die sich, je nachdem, ob nun ein Pointer oder null (nil) übergeben wird, entsprechend verhalten.<br>
    Bleibt mir da nur der "normale" Weg über unsafe Code und "echte" Pointer?<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      Hallo,

      Microsoft stellt unter <i>http://msdn.microsoft.com/vstudio/downloads/samples/automation.asp</i> das Beispielprojekt CRegExploreCtl zur Verfügung. Ist zwar C++, aber eventuell ist dort das Gesuchte zu finden :-

      Comment


      • #4
        Moin Andreas,<br>
        <br>
        danke für den Link.<br>
        Leider scheint es sich dabei um ein "ganz normales" Projekt zu handeln, denn die Übergabe erfolgt wie in C++ üblich mit Pointern.<br>
        Ich konnte nichts C# bzw. .net spezifisches entdecken.<br>
        <br>
        Ciao<br>
        Chri

        Comment


        • #5
          Hallo Christian,

          klingt eigentlich als hättest Du bloss vergessen beim direkten
          Aufruf der Methode auch vor jeder Variablen "ref" voranzustellen.
          Zumindest hatte ich in diesem Fall mal eine solche Fehlermeldung.

          Bsp.:

          RegQueryInfoKey( 123, "xyz", ref Var1, ref Var2, ref Var3, ...

          Gruss Karsten

          Comment

          Working...
          X