Problème de mémoire protégée lors de l'appel d'un fonction issue d'une DLL en C

Signaler
Messages postés
5
Date d'inscription
lundi 18 décembre 2006
Statut
Membre
Dernière intervention
10 septembre 2010
-
Messages postés
5
Date d'inscription
lundi 18 décembre 2006
Statut
Membre
Dernière intervention
10 septembre 2010
-
Bonsoir tout le monde,

Cela fait quelque temps que je rame sur ce problème et j'espère que vous pourrez m'éclairer...
Le contexte :

J'ai développé une DLL en C, qui fait appel à un WebService avec Code::Block et gSoap dont voici le code :

#define DllExport __declspec(dllexport)
DllExport char* LAD_Activation( char* SERIAL, char* CHS, char* PIN){

    int retActivation;
    long soapResult;

    char* TimeData;
    char* ActivationData;
    char* ActivationReturn;

    struct soap *oSoap;
    struct _ns1__Activation *in;
    struct _ns1__ActivationResponse *out;

    oSoap = malloc(sizeof(struct soap));
    in = malloc(sizeof(struct _ns1__Activation));
    out = malloc(sizeof(struct _ns1__ActivationResponse));

    in->serial = SERIAL;
    in->alea = "";

    out->ActivationResult->CodeRetour ;
    out->ActivationResult->Message ;
    out->ActivationResult->Resultats->string ;
    out->ActivationResult->Resultats->__sizestring;

    //Initialisation de la connexion SOAP
    soap_init(oSoap);

    soapResult = 0;

    //Appel au WebService d'activation
    soapResult = soap_call___ns2__Activation( oSoap, NULL, NULL, in, out);

    soap_destroy(oSoap);
    soap_end(oSoap);
    soap_done(oSoap);

    if( soapResult == 0){
        ActivationData = "Activation réussie";
    }
    else{
        ActivationData = "Activation échouée";
    }
    free(oSoap);
    free(in);
    free(out);

    return ActivationData;
}


Je souhaite faire appel à cette DLL depuis un projet C#.
Une foi générée je l'ai donc collé dans le répertoire BIN de mon projet.
Et j'appelle ensuite ma méthode de cette façon :

using System.Runtime.InteropServices;

 [DllImport("LIBANTSYSDIGIPASS.dll")]
 public static extern string LAD_Activation(string SERIAL, string CHS, string PIN);

  static void Main(string[] args){ 
     try{

        string result = LAD_Activation("FDL0179608", "12132123", "1234");
        Console.WriteLine("Activation Result ==> " + result);
        Console.ReadLine();
     }
     catch (Exception e){
        Console.WriteLine(e.ToString());
        Console.ReadLine();
     }
}


Lorsque je compile mon projet C#, je me retrouve avec l'erreur :

"Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire et endommagée."

Il se trouve que lorsque je commente la ligne d'appel au WebService de ma DLL en C, cela compile bien.
//soapResult = soap_call___ns2__Activation( oSoap, NULL, NULL, in, out);

J'ai parcouru tout le web en essayant de passant par des pointeur intPTR et autre sans succès.

Si quelqu'un a déjà développé une DLL en C avec des appels gSoap ou d'autres ont rencontrés le même type de problème, merci de m'éclairer.

Bonne soirée.
A voir également:

4 réponses

Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
tu a alloué la memoire de tes ActivationResult ???
Messages postés
5
Date d'inscription
lundi 18 décembre 2006
Statut
Membre
Dernière intervention
10 septembre 2010

Tout d'abord merci pour ta réactivité.

Voila comment est constitué ma structure _ns1__ActivationResponse :

struct _ns1__ActivationResponse{
struct ns1__DigipassResponse *ActivationResult;
};


struct ns1__DigipassResponse{
int CodeRetour;	/* required element of type xsd:int */
char *Message;	/* optional element of type xsd:string */
struct ns1__ArrayOfString *Resultats;	/* optional element of type ns1:ArrayOfString */
};
#endif

#ifndef SOAP_TYPE_ns1__ArrayOfString
#define SOAP_TYPE_ns1__ArrayOfString (8)
/* ns1:ArrayOfString */
struct ns1__ArrayOfString{
int __sizestring;	/* sequence of elements <string> */
char **string;	/* optional element of type xsd:string */
};


Lorsque j'alloue de la mémoire pour ma structure "out" de type "_ns1__ActivationResponse", ça n'alloue pas la mémoire pour la structure qu'elle contient, "ActivationResult" ?
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
non ce n'est pas alloué directement en C
Messages postés
5
Date d'inscription
lundi 18 décembre 2006
Statut
Membre
Dernière intervention
10 septembre 2010

J'ai donc rajouté l'allocation mémoire pour les structures ActivationResult et Resultats comme ci dessous :

    oSoap = malloc(sizeof(struct soap));
    in = malloc(sizeof(struct _ns1__Activation));
    out = malloc(sizeof(struct _ns1__ActivationResponse));

    out->ActivationResult = malloc(sizeof(struct ns1__DigipassResponse));
    out->ActivationResult->Resultats = malloc(sizeof(struct ns1__ArrayOfString));


Seulement le message d'erreur persiste !