Bonjour,
tout d'abord, je tiens à préciser que je suis tout a fait conscient que ce que je tente de faire n'est pas normal 
En réalité, j'essaye de récupérer le code binaire d'une fonction afin de l'enregistrer dans un fichier, puis de charger le code binaire depuis le fichier jusque dans un pointeur de fonction afin de lancer cette fonction. 
J'ai donc déjà mis en place le code nécessaire à cette opération :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <iostream>
#include <fstream>
#include <cstdlib>
#include <deque>
#include <list>
#include <map>
#include <windows.h>
using namespace std;
uint64_t get_file_size(std::ofstream &file);
uint64_t get_file_size(std::ofstream &file)
{
file.seekp(0, std::ios::end);
uint64_t taille=file.tellp();
file.seekp(0, std::ios::beg);
return taille;
}
uint64_t get_file_size(std::ifstream &file);
uint64_t get_file_size(std::ifstream &file)
{
file.seekg(0,std::ios::end);
uint64_t taille=file.tellg();
file.seekg(0,std::ios::beg);
return taille;
}
void fonction();
void fonction()
{
int test = 5;
cout<<test<<endl;
}
int main()
{
void (*pointeur)() = fonction;
char* save_char = reinterpret_cast<char*>(pointeur);
cout<<save_char<<endl;
ofstream save("test.txt", ios::binary);
int save_size = strlen(save_char);
save.write(save_char, save_size);
save.close();
char* load_char;
ifstream load("test.txt", ios::binary);
int load_size = get_file_size(load);
load_char = new char[load_size];
load.read(load_char, load_size);
cout<<"'"<<load_char<<"' '"<<save_char<<"'"<<endl;
void (*pointeur2)() = reinterpret_cast<void (*)()>(load_char);
(*pointeur2)();
system("pause");
return 0;
} |
la phase d'enregistrement fonctionne, mais c'est au moment de lancer la fonction que le programme plante 
Bon en fait, ça m'étonne pas plus que ça... j'imagine que les variables et les fonctions ne sont pas stocké dans le même espace mémoire et du coup il veut pas.
Évidement, j'obtiens deux jolis warning me disant qu'il est interdit de faire un cast entre une fonction et une variable :
warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object
Ma question est donc la suivante :
Y aurait-il un mot-clé/fonction qui permettrait d'enregistrer une fonction ?
Si oui, lequel ?
Si non, est-ce faisable en assembleur ? ( je sais que c'est pas le bon forum )
Voila voila
c'est une idée à la con qui m'a empêché de dormir hier soir donc je voulais essayé, ne serais-ce que pour le défis technique.
Merci pour votre aide et vos remarques que j'espère constructives.
exkise
Partager