Bonjour à tous,
J'ai codé un DLL avec un fonction transformant un fichier en vector<string>, je ramène le pointeur du vecteur créé dans la partie DLL dans le main de mon exécutable windows et j'essaie d'en exploiter les données. J'obtiens des données cohérente (bon nombre de ligne) mais impossible à lire (donnée proche de l’orignal ou BUG pur et simple).
Je pense que mon problème est lié à un soucis de l'intégrité de la mémoire (ça ou une mauvaise utilisation des pointeurs).
Je vous explique (enfin je vais essayer surtout..) en détails.
Coté DLL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 vector<string>* DllExport parse_file(string mon_fichier) //avec "#define DllExport __declspec(dllexport)" en début de fichier source { vector<string> mon_fichier_en_vector; string ligne; fstream fichier(mon_fichier.c_str()); // on ouvre en lecture while(getline(fichier, ligne)) { mon_fichier_en_vector.push_back((ligne)); } fichier.close(); return &mon_fichier_en_vector; }
Coté main.exe :
En changeant la valeur de 1 (l'index de mon vecteur) j’obtiens soit un plantage, soit un affichage partielle du contenu de mon fichier mais ne correspondant pas forcément à la bonne ligne, voir plusieurs lignes d'un coup... Le plus curieux c'est qu'a force de tâtonner avec la commande (*mymain)[100].size() (au alentour de la centième ligne a peu prés je sais plus trop) j'obtiens un nombre de caractère sur la ligne correspondant bien a mon fichier de départ, j'ai même pu confirmer en modifiant le fichier et relançant le programme que la valeur changeait aussi. Par contre dés que j’essaie d'en lire le contenu avec cout << (*mymain)[100] << endl; tout plante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 HINSTANCE DLLHandle; DLLHandle = LoadLibrary("main.dll"); typedef vector<string>*(*Type_parse_file)(string); //Prototype de la fonction; Type_parse_file parse_file; //Nom de la fonction dans mon main parse_file = (Type_parse_file)GetProcAddress(DLLHandle,"parse_file"); //on récupére l'addresse du dll chargé en mémoire // ...etc.... vector<string> *mymain=parse_file("mon_fichier_a_mettre_en_vector.txt"); //jusque la c'est bon cout << (*mymain).size() << endl; //renvoi une taille conforme au nombre de ligne de mon fichier //par contre cout << (*mymain)[1] << endl; //va se mettre a marquer plus ou moins n'importe quoi
J'ai pu lire pas mal de truc à propos de fuite mémoire, de la commande malloc et autres problèmes/solution lié à la mémoire en général mais je dois bien avouer que là mes compétences sont bien trop limités et j'ai besoin d'un œil et d'une aide extérieur.
Je chercherais bien du coté de la sécurisation de l'espace mémoire dans la partie code du DLL mais je ne sais même pas quel mot clé chercher sur le net. Je nage un peu.
Ndlr : pour le moment j'utilise g++ sous windows.
Merci
Partager