Question

J'utilise une DLL écrite en C ++ dans mon projet C #. Je suis en mesure d'appeler des fonctions au sein de la DLL en utilisant ce code:

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

Maintenant je dois appeler une fonction qui requres un pointeur de type personnalisé. Docs pour la DLL layout de la fonction comme ceci:

hid_get_info(int n,PDEV_INFO *pdi)

Je ne sais pas comment utiliser ce pointeur personnalisé. Est-ce que défini dans la DLL? Si oui, comment peut l'utiliser du projet C #? Sinon dois-je inclure le fichier d'en-tête en C #? Merci d'avance pour votre aide.

Était-ce utile?

La solution

Étant donné le préfixe « P », il semble que la déclaration réelle est

hid_get_info(int n, DEV_INFO **pdi)

où dev_info est une structure. Vous aurez besoin de trouver la déclaration de cette structure et l'ajouter à votre code C # avec l'attribut [StructLayout]. Vous auriez alors déclarer la fonction comme ceci dans votre code C #:

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

et utiliser pour obtenir la valeur de structure Marshal.PtrToStructure (). Nous espérons que vous n'avez pas à libérer la structure, vous seriez vissable.

Une seconde interprétation est que « pid » retourne un tableau de pointeurs vers des structures dev_info. Un peu probable étant donné l'argument « n », ce qui pourrait bien signifier le nombre d'éléments du tableau que vous passez à remplir par la fonction. Dans ce cas, passer un IntPtr [] et réglez « n » à sa longueur.

Autres conseils

Vous devez créer un struct en C # qui reflète le C ++ PDEV_INFO struct en C ++.

Vous devez appliquer [StructLayout(LayoutKind.Sequential)] à la struct puis copiez les champs de la struct C ++ (regardez le fichier d'en-tête) dans l'ordre.

Vous pouvez alors écrire une méthode extern qui prend la struct comme paramètre ref.

Je suppose en toute sécurité PDEV_INFO* est un DEV_INFO**.

Utilisez cette option C #:

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top