survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 2022
-
26 mai 2007 à 13:18
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 2022
-
29 mai 2007 à 13:21
Désole je ne sais pas dans quel theme je vais..
Bref J'ai un petit soucis à l'utilisation d'une dll.
Elle est déclarée comme cela :
[DllImport(DLLFileName, EntryPoint="GM_SetProjection")]
public static extern GM_Error_t32 GM_SetProjection(ref GM_Projection_t aProj);
et GM_Projection_t est une structure comme celle-la
public
struct
GM_Projection_t
{
public
PROJSYS
ProjSys;
// Projection system
public
DATUM
Datum;
// Horizontal datum
public
UNIT
Unit;
// Ground units
public
IntPtr
AttrList;
// Pointer to attribute list. Pointer to GM_ProjAttrValue_t
public
UInt32
NumAttrs;
// Number of attributes in attribute list
};
Et je ne sais pas comment l'appeler
j'arrive à modifier les parametres de GM_Projection_tGM_Projection_t
Mais je n'arrive pas à faire marcher la fonctionGlobalMapperDLL.GM_SetProjection(
ref theUtmProj);
Coq m'a fait remarquer que je n'initialisais pas AttrList qui est un pointeur GM_ProjAttrValue_t sur la structure en effet c'est un autre de mes nombreux problèmes
public
struct
GM_ProjAttrValue_t
{
public
PROJATTR mAttr;
// Attribute
public
double mValue;
// Attribute value
};
public
enum
PROJATTR :
short
{
FIRST_STANDARD_PARALLEL = 0,
SECOND_STANDARD_PARALLEL,
}
Et pour les plus doués j'ai encore une question du même genre , mais chaque chose en son temps ne soyez pas trop gourmand
P.S.: n'empêche qu'il manque un petit tuto pour les moins doués d'entre nous
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 26 mai 2007 à 15:39
Salut, non seulement tu n'initialises pas AttrList mais il n'est même pas à NULL, il contient une valeur aléatoire. Regardes Marshal.StructureToPtr. Tu ne donnes pas les définitions de PROJSYS ou de DATUM, es tu sûr de la validité de toutes ces définitions de structures, par exemple malgré une enum de type short le type GM_ProjAttrValue_t fait quand même 16 bits.
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 26 mai 2007 à 16:19
Merci pour ta réponse
j'arrive à initialiser PROJSYS et DATUM
GM_Projection_t theUtmProj;
theUtmProj.ProjSys = GlobalMapperDLLWrapper.PROJSYS.GM_PRJ_SNSOID;
theUtmProj.Datum = GlobalMapperDLLWrapper.DATUM.GM_DATUM_WGS_84 ;
theUtmProj.Unit = GlobalMapperDLLWrapper.UNIT.GM_PRJ_UNIT_METERS;
theUtmProj.NumAttrs = 1;
au pas à pas je vois bien qu'elles changent
J'ai recupere le code dans le SDK d'un logiciel que je compte utiliser , pour l'instant j'ai juste commencé à regarder ,et en plus je suis un peu paumé dans la gestion des pointeurs (je viens de VB)
Je ne sais pas comment initialiser la strusture pointée par pointeur GM_ProjAttrValue_t , j'ai essayé ca :
GM_ProjAttrValue_t
abc;
abc.mAttr = PROJATTR.ASCENTION_LONGITUDE;
abc.mValue = 0;
theUtmProj.AttrList = IntPtr abc; et à l'attribution ca ne marche pas, je ne sais pas comment addresser le pointeur AttrList
Et en plus je ne suis pas suffisament competent pour comprendre la fonction Marshal.StructureToPtr meme avec la super traduction du MSDN , je vais y passer du temps dessus , si tu en parles c'est que ca vaut le coup.
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 26 mai 2007 à 17:28
Super ca marche ,si j'ai bien compris quand je fais ça theUtmProj.AttrList = buffer; je donne l'adresse ou se trouve mes infos
mais maintenant comment j'appelle ma fonction
GlobalMapperDLL.GM_SetProjection(???);
Qui est déclaré comme ca
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 29 mai 2007 à 13:20
Merci lutinore
Ca marche presque j'arrive à appeler ma fonction mais quand je quitte la fonction que j'ai appellé , ici une form de selection de donnée , j'ai un joli merssage de visual studio :
"Le runtime a rencontré une erreur irrécupérable. L'adresse de l'erreur était 0x79e755fc sur le thread 0x91c.
Le code d'erreur est 0xc0000005.
Il s'agit peut-être d'un bogue dans le CLR ou dans les portions unsafe ou non vérifiables du code utilisateur.
Les causes courantes de ce bogue incluent des erreurs de marshaling utilisateur pour COM-Interop ou PInvoke, erreurs susceptibles d'endommager la pile."
mon code ressemble à ça
GM_Projection_t theUtmProj;
theUtmProj.ProjSys = GlobalMapperDLLWrapper.PROJSYS.GM_PRJ_SNSOID;
theUtmProj.Datum = GlobalMapperDLLWrapper.DATUM.GM_DATUM_WGS_84 ;
theUtmProj.Unit = GlobalMapperDLLWrapper.UNIT.GM_PRJ_UNIT_METERS;
theUtmProj.NumAttrs = 1;
GlobalMapperDLL.GM_SelectProjection(ref theUtmProj, ref theUtmProj); // appelle de la fenetre de selection
Et la fonction est déclarée comme ca
[DllImport(DLLFileName, EntryPoint = "GM_SelectProjection")]
public static extern GM_Error_t32 GM_SelectProjection(ref GM_Projection_t aSelProj, ref GM_Projection_t aInitProj);
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 29 mai 2007 à 13:21
Merci lutinore
Ca marche presque j'arrive à appeler ma fonction mais quand je quitte la fonction que j'ai appellé , ici une form de selection de donnée , j'ai un joli merssage de visual studio :
"Le runtime a rencontré une erreur irrécupérable. L'adresse de l'erreur était 0x79e755fc sur le thread 0x91c.
Le code d'erreur est 0xc0000005.
Il s'agit peut-être d'un bogue dans le CLR ou dans les portions unsafe ou non vérifiables du code utilisateur.
Les causes courantes de ce bogue incluent des erreurs de marshaling utilisateur pour COM-Interop ou PInvoke, erreurs susceptibles d'endommager la pile."
mon code ressemble à ça
GM_Projection_t theUtmProj;
theUtmProj.ProjSys = GlobalMapperDLLWrapper.PROJSYS.GM_PRJ_SNSOID;
theUtmProj.Datum = GlobalMapperDLLWrapper.DATUM.GM_DATUM_WGS_84 ;
theUtmProj.Unit = GlobalMapperDLLWrapper.UNIT.GM_PRJ_UNIT_METERS;
theUtmProj.NumAttrs = 1;
GlobalMapperDLL.GM_SelectProjection(ref theUtmProj, ref theUtmProj); // appelle de la fenetre de selection
Et la fonction est déclarée comme ca
[DllImport(DLLFileName, EntryPoint = "GM_SelectProjection")]
public static extern GM_Error_t32 GM_SelectProjection(ref GM_Projection_t aSelProj, ref GM_Projection_t aInitProj);