Question

Je dois appeler une dll externe à partir de c #. Voici la définition de l'en-tête:

enum WatchMode { 
   WATCH_MODE_SYSTEM = 0,          
   WATCH_MODE_APPLICATION  = 1 };  

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

J'ai ajouté l'énumération et l'appel en C #:

public enum WatchMode
{
    WATCH_MODE_SYSTEM = 0,
    WATCH_MODE_APPLICATION = 1       
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

Ceci génère une exception AccessViolationException. Je sais que la dll "fonctionne" car j'ai également ajouté un appel à GetHandle qui renvoie le hHandle mentionné ci-dessus. J'ai essayé de changer le paramètre en int ( ref int watchmode ), mais je reçois la même erreur. Est-ce que quelqu'un ne sait pas comment je peux invoquer l'appel ci-dessus?

Était-ce utile?

La solution

Vous rencontrez un problème de taille de paramètre entre C # et C ++. Dans le monde C ++ / windows, LONG est un entier signé sur 4 octets. Dans le monde C #, il existe un entier signé de 8 octets. Vous devez modifier votre signature C # pour prendre un int.

ffpf a tort de dire que vous devriez utiliser un IntPtr ici. Cela résoudra ce problème particulier sur une machine 32 bits puisqu'un IntPtr sera marshal comme un int. Si vous exécutez ceci sur une machine 64 bits, il sera à nouveau marshal en tant qu'entier signé signé sur 8 octets et tombera en panne.

Autres conseils

L’équipe d’interopérabilité gérée, native et COM a publié PInvoke Interop Assistant sur codeplex. Peut-être que cela peut créer la signature appropriée. http://www.codeplex.com/clrinterop/Release/ProjectReleases. aspx? ReleaseId = 14120

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top