Je souhaite appeler le Garmin API dans le projet VB.Net Compact Framework. L'API est en C++, donc je fais un projet C# dll comme moyen intermédiaire entre API dll et VB.NET. J'ai quelques problèmes lors de l'exécution de mon code car il lance un NotSupportedException
(mauvais type d'arguments, je pense) dans l'appel QueCreatePoint
. Voici le code de l'API C++ et mon travail en C#.Gestion de l'API C++ Garmin en C#
C++ Fonctions prototype et C# P/Invoke Appels:
QueAPIExport QueErrT16 QueCreatePoint(const QuePointType* point, QuePointHandle* handle);
QueAPIExport QueErrT16 QueClosePoint(QuePointHandle point);
[DllImport("QueAPI.dll")]
private static extern QueErrT16 QueCreatePoint(ref QuePointType point, ref uint handle);
[DllImport("QueAPI.dll")]
private static extern QueErrT16 QueRouteToPoint(uint point);
QueErrT16:
typedef uint16 QueErrT16; enum { ... }
public enum QueErrT16 : ushort { ... }
QuePointType:
typedef struct
{
char id[25];
QueSymbolT16 smbl;
QuePositionDataType posn;
} QuePointType;
public struct QuePointType
{
public string id;
public QueSymbolT16 smbl;
public QuePositionDataType posn;
}
QueSymbolT16:
typedef uint16 QueSymbolT16; enum { ... }
public enum QueSymbolT16 : ushort { ... }
QuePositionDataType:
typedef struct
{
sint32 lat;
sint32 lon;
float altMSL;
} QuePositionDataType;
public struct QuePositionDataType
{
public int lat;
public int lon;
public float altMSL;
}
QuePointHandle:
typedef uint32 QuePointHandle;
En C# je gère comme un uint
var.
Et ceci est ma fonction actuelle C# pour appeler tout cela:
public static QueErrT16 GarminNavigateToCoordinates(double latitude , double longitude)
{
QueErrT16 err = new QueErrT16();
// Open API
err = QueAPIOpen();
if(err != QueErrT16.queErrNone)
{
return err;
}
// Create position
QuePositionDataType position = new QuePositionDataType();
position.lat = GradosDecimalesASemicirculos(latitude);
position.lon = GradosDecimalesASemicirculos(longitude);
// Create point
QuePointType point = new QuePointType();
point.posn = position;
// Crete point handle
uint hPoint = new uint();
err = QueCreatePoint(ref point, ref hPoint); // HERE i got a NotSupportedException
if (err == QueErrT16.queErrNone)
{
err = QueRouteToPoint(hPoint);
}
// Close API
QueAPIClose();
return err;
}
Wow, ça a l'air dur. Il y a un outil pour faire l'emballage? Ma connaissance de C est faible, et je n'ai aucune idée de l'emballage d'une API native. Je vois cette autre personne faire un Wrapper (http://christian-helle.blogspot.com/2008/02/integrating-with-garmin-mobile-xt.html), mais je ne peux pas l'utiliser dans .NET 1.1. C'est la raison pour laquelle j'utilise P/Invoke à la place. Merci. –