Frage

Ich brauche eine externe DLL von c # nennen. Dies ist die Header-Definition:

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

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

Ich habe die Enum und den Anruf in C # hinzugefügt:

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);

Dies erzeugt eine Access. Ich weiß, dass die DLL ‚arbeiten‘, weil ich habe auch einen Aufruf an GetHandle welche gibt die hHandle oben genannten hinzugefügt. Ich habe versucht, die param zu einem int (ref int watchmode) zu ändern, aber den gleichen Fehler. Doesn Wer weiß, wie ich das oben Anruf PInvoke kann?

War es hilfreich?

Lösung

Sie laufen in einen Parameter Größe Problem Unterschied zwischen C # und C ++. In der C ++ / Windows-Welt LONG ist eine 4-Byte-Ganzzahl mit Vorzeichen. In der C # Welt lang ist eine 8-Byte-Ganzzahl mit Vorzeichen. Sie sollten Ihren C # -Signatur ändern, um einen int zu übernehmen.

ffpf ist falsch zu sagen, dass Sie einen IntPtr hier verwendet werden soll. Es wird dieses spezielle Problem auf einer 32-Bit-Maschine befestigen, da ein IntPtr als int Marschall wird. Wenn Sie diese auf einem 64-Bit-Maschine läuft es Marschall als 8-Byte-Ganzzahl mit Vorzeichen wieder und abstürzt.

Andere Tipps

Die Managed, Ureinwohner, und COM-Interop-Team veröffentlicht die PInvoke Interop Assistant auf Codeplex. Vielleicht kann es die richtige Signatur erstellen. http://www.codeplex.com/clrinterop/Release/ProjectReleases. aspx? RELEASEID = 14120

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top