Bonjour à tous.
J'aimerai faire en C++ (non managé) une chose que je fais en C# :
Je génère du code (une classe par exemple), puis j'utilise un objet qui permet d'invoquer le compilateur C#, ca me fait une DLL que je charge aussitot dans le process, un petit coup de reflexion et hop la nouvelle classe s'intègre à l'application.
Seulement voila, je ne me voit pas trop distribuer tout un compilo avec mon programme. Donc j'ai cherché un compilateur "intégrable" mais je n'ai rien trouvé...
Résultat je me dis que je ne vais pas avoir le choix, je dois distribuer un compilo avec ou du moins permettre a l'utilisateur de spécifié le compilo installé sur sa machine.
Seulement voila, j'ai ouïe dire qu'il n'est pas bon de mixer les compilos (en gros il faudrait que la compilation a la volée utilise le même compilo que celui qui a servit à compiler l'application).
Dans quelle mesure c'est impactant ?
Sinon j'ai fais un premier jet avec le compilo de Visual Studio 2010 Ultimate, mais ca gauffre violemment dans la fonction CreateProcess. Il me dit qu'il y a une exception non gérée, violation d'accès lors de l'écriture, et le débogueur m'amène dans le fichier dbgheap.c, ligne 239. Je capte pas comment ca se fait.
Le code utilisé est le suivant :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <iostream> #include <fstream> #include <windows.h> int main(int argc, wchar_t* argv[]) { // Création d'un fichier source std::ofstream file("test.cpp", std::ios::out); if(!file) { std::cerr << "Impossible d'ouvrir le fichier test.cpp" << std::endl; return -1; } file << "#include <iostream>" << std::endl; file << "void hello() { std::cout << \"hello !\" << std::endl; }" << std::endl; file.close(); STARTUPINFO siStartupInfo; PROCESS_INFORMATION piProcessInfo; memset(&siStartupInfo, 0, sizeof(siStartupInfo)); memset(&piProcessInfo, 0, sizeof(piProcessInfo)); siStartupInfo.cb = sizeof(siStartupInfo); wchar_t* env[2]; env[0] = L"PATH=%PATH%;D:\\softs\\Microsoft Visual Studio 2010\\Common7\\IDE"; env[1] = 0; int result = CreateProcess(0, L"D:\\softs\\Microsoft\\ Visual\\ Studio\\ 2010\\VC\\bin\\cl.exe /EHsc test.cpp", 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE, 0, L"D:\\programmation\\projects\\dynamic_compil\\dynamic_compil", &siStartupInfo, &piProcessInfo); if(!result) { std::cerr << GetLastError() << std::endl; } return 0; }
Merci de votre aide![]()
Partager