Utilisation d'une dll

survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 - 26 mai 2007 à 13:18
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 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

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;

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

MERCI

www.survey-copter.com

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
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.
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 1
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.

Merci

www.survey-copter.com
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
26 mai 2007 à 16:44
Disons que StructureToPtr c'est pas ma solution préférée mais c'est la plus simple à expliquer.

try
{
    GM_ProjAttrValue_t projAttr;
    projAttr.mAttr = PROJATTR.FIRST_STANDARD_PARALLEL;
    projAttr.mValue = 1.0; // Ou je sais pas quoi..


    // Alloue le buffer dans le tas non managé.
    buffer = Marshal.AllocHGlobal( Marshal.SizeOf( typeof( GM_ProjAttrValue_t ) ) );


    // Copie la structure dans le buffer.
    Marshal.StructureToPtr( projAttr, buffer, false );


    theUtmProj.AttrList = buffer;


    // ..
}
finally
{
    if ( buffer != IntPtr.Zero )
        Marshal.FreeHGlobal( buffer );
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
26 mai 2007 à 16:46
Mince.. au copié-collé j'ai perdu la première ligne :

IntPtr buffer = IntPtr.Zero;


try
{
    GM_ProjAttrValue_t projAttr;
    projAttr.mAttr = PROJATTR.FIRST_STANDARD_PARALLEL;
    projAttr.mValue = 1.0; // Ou je sais pas quoi..


    // Alloue le buffer dans le tas non managé.
    buffer = Marshal.AllocHGlobal( Marshal.SizeOf( typeof( GM_ProjAttrValue_t ) ) );


    // Copie la structure dans le buffer.
    Marshal.StructureToPtr( projAttr, buffer, false );


    theUtmProj.AttrList = buffer;


    // ..
}
finally
{
    if ( buffer != IntPtr.Zero )
        Marshal.FreeHGlobal( buffer );
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 1
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

[
DllImport(DLLFileName, EntryPoint=
"GM_SetProjection")]

public
static
extern
GM_Error_t32 GM_SetProjection(
ref
GM_Projection_t aProj);

Merci





www.survey-copter.com
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 1
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;

           
            IntPtr buffer = IntPtr.Zero;
            try
            {
                GM_ProjAttrValue_t projAttr;
                projAttr.mAttr = PROJATTR.FIRST_STANDARD_PARALLEL;
                projAttr.mValue = 1.0;

                // Alloue le buffer dans le tas non managé.
                buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(GM_ProjAttrValue_t)));

                // Copie la structure dans le buffer.
                Marshal.StructureToPtr(projAttr, buffer, false);

                theUtmProj.AttrList = buffer;
            }
            finally
            {
                if (buffer != IntPtr.Zero)
                    Marshal.FreeHGlobal(buffer);
            }

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

www.survey-copter.com
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 1
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;

           
            IntPtr buffer = IntPtr.Zero;
            try
            {
                GM_ProjAttrValue_t projAttr;
                projAttr.mAttr = PROJATTR.FIRST_STANDARD_PARALLEL;
                projAttr.mValue = 1.0;

                // Alloue le buffer dans le tas non managé.
                buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(GM_ProjAttrValue_t)));

                // Copie la structure dans le buffer.
                Marshal.StructureToPtr(projAttr, buffer, false);

                theUtmProj.AttrList = buffer;
            }
            finally
            {
                if (buffer != IntPtr.Zero)
                    Marshal.FreeHGlobal(buffer);
            }

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

merci

www.survey-copter.com
0