P/Invoke con punteros
Publicado por Borjolujo (1 intervención) el 26/08/2009 09:14:36
Mis conocimientos de C++ son más que limitados, así que os pido un poco de ayuda. Necesitaria crear las llamadas P/Invoke de unas funciones de la API de Garmin Mobile XT (http://developer.garmin.com/mobile/mobile-sdk/) para Visual Basic .NET (Compact Framework 1.1). He podido pasar otras más sencillas, pero esta con punteros y handles me superan. Os dejo la información necesaria:
-- Prototipos de las dos funciones --
QueAPIExport QueErrT16 QueCreatePoint( const QuePointType* point, QuePointHandle* handle );
QueAPIExport QueErrT16 QueRouteToPoint( QuePointHandle point );
-- QueAPIExport --
#define QueAPIExport __declspec(dllimport)
-- QueErrT16 --
typedef uint16 QueErrT16; enum { ... }
-- QuePointType --
typedef struct { ... } QuePointType;
-- QuePointHandle --
typedef uint32 QuePointHandle;
El intento con el que (creo) más me he acercado es el siguiente (al primero pasandole como handle un IntPtr.Zero, no se me ocurrió otra cosa):
<DllImport("QueAPI.dll")> _
Public Shared Function QueCreatePoint(ByRef point As QuePointType, ByRef handle As IntPtr) As QueErrT16
End Function
<DllImport("QueAPI.dll")> _
Public Shared Function QueRouteToPoint(ByVal point As IntPtr) As QueErrT16
End Function
Por si os sirviese de ayuda, os dejo parte del código (C++) de un señor que se ha currado un manejador de la API (http://christian-helle.blogspot.com/2008/02/integrating-with-garmin-mobile-xt.html). Yo querría hacer lo mismo pero en VB.Net:
QuePointType point;
QuePositionDataType position;
memset(&position, 0, sizeof(QuePositionDataType));
position.lat = DecimalDegreesToSemicircles(latitude);
position.lon = DecimalDegreesToSemicircles(longitude);
memset(&point, 0, sizeof(QuePointType));
point.posn = position;
QuePointHandle hPoint;
memset(&hPoint, 0, sizeof(QuePointHandle));
err = QueCreatePoint(&point, &hPoint);
if (err == queErrNone && hPoint != queInvalidPointHandle) {
err = QueRouteToPoint(hPoint);
}
Ya dije que soy un piltrafilla en C++, así que por si acaso os diré que nemset es una función de MEMORY.H y su prototipo es:
void * __cdecl memset(void *, int, size_t);
Gracias de antemano :)
-- Prototipos de las dos funciones --
QueAPIExport QueErrT16 QueCreatePoint( const QuePointType* point, QuePointHandle* handle );
QueAPIExport QueErrT16 QueRouteToPoint( QuePointHandle point );
-- QueAPIExport --
#define QueAPIExport __declspec(dllimport)
-- QueErrT16 --
typedef uint16 QueErrT16; enum { ... }
-- QuePointType --
typedef struct { ... } QuePointType;
-- QuePointHandle --
typedef uint32 QuePointHandle;
El intento con el que (creo) más me he acercado es el siguiente (al primero pasandole como handle un IntPtr.Zero, no se me ocurrió otra cosa):
<DllImport("QueAPI.dll")> _
Public Shared Function QueCreatePoint(ByRef point As QuePointType, ByRef handle As IntPtr) As QueErrT16
End Function
<DllImport("QueAPI.dll")> _
Public Shared Function QueRouteToPoint(ByVal point As IntPtr) As QueErrT16
End Function
Por si os sirviese de ayuda, os dejo parte del código (C++) de un señor que se ha currado un manejador de la API (http://christian-helle.blogspot.com/2008/02/integrating-with-garmin-mobile-xt.html). Yo querría hacer lo mismo pero en VB.Net:
QuePointType point;
QuePositionDataType position;
memset(&position, 0, sizeof(QuePositionDataType));
position.lat = DecimalDegreesToSemicircles(latitude);
position.lon = DecimalDegreesToSemicircles(longitude);
memset(&point, 0, sizeof(QuePointType));
point.posn = position;
QuePointHandle hPoint;
memset(&hPoint, 0, sizeof(QuePointHandle));
err = QueCreatePoint(&point, &hPoint);
if (err == queErrNone && hPoint != queInvalidPointHandle) {
err = QueRouteToPoint(hPoint);
}
Ya dije que soy un piltrafilla en C++, así que por si acaso os diré que nemset es una función de MEMORY.H y su prototipo es:
void * __cdecl memset(void *, int, size_t);
Gracias de antemano :)
Valora esta pregunta


0