Frage

Ich verwende eine DLL in C ++ geschrieben in meiner C # -Projekt. Ich konnte Funktionen innerhalb der DLL nennen diesen Code verwenden:

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

Jetzt brauche ich eine Funktion aufrufen, die einen benutzerdefinierten Typ Zeiger requres. Die Docs für die DLL-Layout die Funktion wie folgt aus:

hid_get_info(int n,PDEV_INFO *pdi)

Ich weiß nicht, wie sich diese benutzerdefinierten Zeiger verwenden. Ist das in der DLL definiert? Wenn ja, wie kann es von C # Projekt verwenden? Wenn nicht muss ich die Header-Datei in c # enthalten? Vielen Dank im Voraus für Ihre Hilfe.

War es hilfreich?

Lösung

„P“ Präfix gegeben, es sieht aus wie die wirkliche Erklärung

hid_get_info(int n, DEV_INFO **pdi)

wo DEV_INFO ist eine Struktur. Sie müssen die Erklärung dieser Struktur finden und es zu Ihrem C # -Code fügen mit dem [StructLayout] Attribute. Sie würden dann die Funktion wie diese in Ihrer C # -Code deklarieren:

[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);

und verwenden Marshal.PtrToStructure (), um die Struktur-Wert zu erhalten. Hoffentlich müssen Sie nicht die Struktur frei, Sie geschraubt werden würde.

Eine zweite Interpretation ist, dass „pid“ gibt einen Array von Zeigern auf Strukturen DEV_INFO. Etwas wahrscheinlich das „n“ Argument, das auch die Anzahl der Elemente in der Anordnung durch die Funktion zu füllen Sie passieren könnte bedeuten. In diesem Fall ein IntPtr [] wählen und „n“ auf seine Länge übergeben.

Andere Tipps

Sie benötigen einen struct in C # erstellen, die die C ++ PDEV_INFO struct in C ++ Spiegel.

Sie sollten [StructLayout(LayoutKind.Sequential)] auf die Struktur aufzubringen und dann die Felder aus der C ++ struct kopieren (Blick auf die Header-Datei) um.

Sie können dann eine extern Methode schreiben, die die struct als ref Parameter annimmt.

Ich werde sicher davon ausgehen, PDEV_INFO* ein DEV_INFO** ist.

Verwenden Sie diese in C #:

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top