none
Selber IDE machen in Visual Studio mit MinGW Compiler RRS feed

  • Frage

  • Hallo!

    Ich habe vor so etwas wie eine IDE selber zu machen, also mit Editor, Projektdateien.. (ohne Debugger und so)

    dazu will ich den MinGW Compiler (g++.exe) verwenden.

    #pragma once
    #include <Windows.h>
    #include <ShellApi.h>
    
    ...
    
    #pragma endregion
    
    	private: Void compile(List<String^>^ files)
    			 {
    				 for each(String^ file in files)
    				 {
    					 String^ temp;
    					 String^ temp2;
    					 temp += gccPath;
    					 temp += "\\g++.exe";
    					 temp2 += " -c ";
    					 temp2 += file;
    					 ShellExecuteA(NULL, "open", (char const *)Marshal::StringToHGlobalAnsi(temp).ToPointer(), (char const *)Marshal::StringToHGlobalAnsi(temp2).ToPointer(), NULL, SW_SHOWNORMAL);
    				 }
    			 }
    	private: Void link(List<String^>^ files)
    			 {
    				 String^ temp;
    				 String^ temp2;
    				 temp += gccPath;
    				 temp += "\\g++.exe";
    				 temp2 += " -o ";
    				 temp2 += outputFileName;
    				 for each(String^ file in files)
    				 {
    					 temp2 += " ";
    					 temp2 += file;
    				 }
    				 ShellExecuteA(NULL, "open", (char const *)Marshal::StringToHGlobalAnsi(temp).ToPointer(), (char const *)Marshal::StringToHGlobalAnsi(temp2).ToPointer(), NULL, SW_SHOWNORMAL);
    			 }
    
    	private: Void setGccPath()
    			 {
    				 MessageBox::Show("Wählen Sie den Pfad des Gcc-Compilers");
    				 FolderBrowserDialog^ gccPathDialog = gcnew FolderBrowserDialog;
    				 if(gccPathDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 gccPath = gccPathDialog->SelectedPath;
    					 Microsoft::Win32::RegistryKey^ key;
    					 key = Microsoft::Win32::Registry::CurrentUser;
    					 key->OpenSubKey("Software\\apps-programme" ,true);
    					 key->SetValue("gcc.path", gccPath);
    					 key->Close();
    				 }
    				 else
    				 {
    					 return setGccPath();
    				 }
    			 }
    
    	private: Void getGccPath()
    			 {
    				 Microsoft::Win32::RegistryKey^ key;
    				 key = Microsoft::Win32::Registry::CurrentUser;
    				 key->OpenSubKey("Software\\apps-programme", false);
    
    				 if(key->GetValue("gcc.path", "")->ToString() == "")
    				 {
    					 setGccPath();
    				 }
    				 else
    				 {
    					 gccPath = key->GetValue("gcc.path")->ToString();
    				 }
    
    				 key->Close();
    			 }
    
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 getGccPath();
    			 }
    	private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
    				 OpenFileDialog^ temp = gcnew OpenFileDialog;
    				 temp->Filter = "C++|*.cpp";
    				 temp->FilterIndex = 1;
    				 temp->InitialDirectory = ".";
    				 temp->Multiselect = true;
    				 if(temp->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 for each(String^ t in temp->FileNames)
    					 {
    						 listBox1->Items->Add(t);
    					 }
    				 }
    			 }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(t);
    			 }
    			 compile(temp);
    		 }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(IO::Path::GetFileNameWithoutExtension(t) + ".o");
    			 }
    			 link(temp);
    		 }
    };
    }
    
    

    button1 ist zum Compilieren der einzelnen Dateien --> compile(...)

    button2 zum linken --> link(...);

    am anfang füge ich die .cpp dateien in die listBox1 ein

     

    Wenn ich jetzt auf button1/button2 zum compillieren/linken klicke,

    öffnet sich kurz g++ und schließt sich sofort wieder.

    1. was mache ich falsch?

    2. sollte ich wohl eher in nem speziellen MinGW Forum fragen? (frage HIER weil das Programm selber nen WinForms-Projekt ist)


    Markus F.
    Montag, 22. März 2010 16:03

Antworten

  • So funktioniert jetzt:

    ...
    
    	private: Void compile(List<String^>^ files)
    			 {
    				 for each(String^ file in files)
    				 {
    					 String^ temp;
    					 temp += " -c ";
    					 temp += IO::Path::GetFileName(file);
    					 Process::Start(gccPath + "\\g++.exe", temp);
    				 }
    			 }
    	private: Void link(List<String^>^ files)
    			 {
    				 String^ temp;
    				 temp += " -o ";
    				 temp += outputFileName;
    				 for each(String^ file in files)
    				 {
    					 temp += " ";
    					 temp += IO::Path::GetFileName(file);
    				 }
    				 Process::Start(gccPath + "\\g++.exe", temp);
    			 }
    
    	private: Void setGccPath()
    			 {
    				 MessageBox::Show("Wählen Sie den Pfad des Gcc-Compilers");
    				 FolderBrowserDialog^ gccPathDialog = gcnew FolderBrowserDialog;
    				 if(gccPathDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 gccPath = gccPathDialog->SelectedPath;
    					 Microsoft::Win32::RegistryKey^ key;
    					 key = Microsoft::Win32::Registry::CurrentUser;
    					 key->OpenSubKey("Software\\apps-programme" ,true);
    					 key->SetValue("gcc.path", gccPath);
    					 key->Close();
    				 }
    				 else
    				 {
    					 return setGccPath();
    				 }
    			 }
    
    	private: Void getGccPath()
    			 {
    				 Microsoft::Win32::RegistryKey^ key;
    				 key = Microsoft::Win32::Registry::CurrentUser;
    				 key->OpenSubKey("Software\\apps-programme", false);
    
    				 if(key->GetValue("gcc.path", "")->ToString() == "")
    				 {
    					 setGccPath();
    				 }
    				 else
    				 {
    					 gccPath = key->GetValue("gcc.path")->ToString();
    				 }
    
    				 key->Close();
    			 }
    
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 getGccPath();
    			 }
    	private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
    				 OpenFileDialog^ temp = gcnew OpenFileDialog;
    				 temp->Filter = "C++|*.cpp";
    				 temp->FilterIndex = 1;
    				 temp->InitialDirectory = ".";
    				 temp->Multiselect = true;
    				 if(temp->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 for each(String^ t in temp->FileNames)
    					 {
    						 listBox1->Items->Add(t);
    					 }
    				 }
    			 }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(t);
    			 }
    			 compile(temp);
    		 }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(IO::Path::GetFileNameWithoutExtension(t) + ".o");
    			 }
    			 link(temp);
    		 }
    };
    }
    
    


    Markus F.
    • Als Antwort markiert Neuer_user Montag, 22. März 2010 17:55
    Montag, 22. März 2010 17:55

Alle Antworten

  • Hallo Neuer_user!

    > Wenn ich jetzt auf button1/button2 zum compillieren/linken klicke,
    >
    > öffnet sich kurz g++ und schließt sich sofort wieder.
    >
    > 1. was mache ich falsch?

    Du rufst vermutlich den gcc mit dem flaschen Parametern auf, oder er
    kann die Datei nicht finden....

    Du solltest Process::Start verwenden und die Ausgabe umleiten, damit Du
    diese bei Dir anzeigen kannst...

    > 2. sollte ich wohl eher in nem speziellen MinGW Forum fragen? (frage
    > HIER weil das Programm selber nen WinForms-Projekt ist)

    Ja, zumindest was den GCC Aufruf angeht...

    Jochen Kalmbach (MVP VC++)
    Montag, 22. März 2010 17:19
  • 1. ich probiers glaich mal aus mit Process::Start vlt gehts ja dann

    2. dann werd ich vlt mal nen MinGW forum suchen...


    Markus F.
    Montag, 22. März 2010 17:35
  • so habs jetzt mit Process::Start gemacht, gab ne Exception.. hat die Datei nicht gefunden

    Ich hab das jetzt so umgeändert dass er die Datei findet..geht aber immer noch nicht

    liegt dann wohl an den Parametern ich probier dann noch nen bischen rum ansonsten frag ich dann in nem mingw forum


    Markus F.
    Montag, 22. März 2010 17:44
  • So funktioniert jetzt:

    ...
    
    	private: Void compile(List<String^>^ files)
    			 {
    				 for each(String^ file in files)
    				 {
    					 String^ temp;
    					 temp += " -c ";
    					 temp += IO::Path::GetFileName(file);
    					 Process::Start(gccPath + "\\g++.exe", temp);
    				 }
    			 }
    	private: Void link(List<String^>^ files)
    			 {
    				 String^ temp;
    				 temp += " -o ";
    				 temp += outputFileName;
    				 for each(String^ file in files)
    				 {
    					 temp += " ";
    					 temp += IO::Path::GetFileName(file);
    				 }
    				 Process::Start(gccPath + "\\g++.exe", temp);
    			 }
    
    	private: Void setGccPath()
    			 {
    				 MessageBox::Show("Wählen Sie den Pfad des Gcc-Compilers");
    				 FolderBrowserDialog^ gccPathDialog = gcnew FolderBrowserDialog;
    				 if(gccPathDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 gccPath = gccPathDialog->SelectedPath;
    					 Microsoft::Win32::RegistryKey^ key;
    					 key = Microsoft::Win32::Registry::CurrentUser;
    					 key->OpenSubKey("Software\\apps-programme" ,true);
    					 key->SetValue("gcc.path", gccPath);
    					 key->Close();
    				 }
    				 else
    				 {
    					 return setGccPath();
    				 }
    			 }
    
    	private: Void getGccPath()
    			 {
    				 Microsoft::Win32::RegistryKey^ key;
    				 key = Microsoft::Win32::Registry::CurrentUser;
    				 key->OpenSubKey("Software\\apps-programme", false);
    
    				 if(key->GetValue("gcc.path", "")->ToString() == "")
    				 {
    					 setGccPath();
    				 }
    				 else
    				 {
    					 gccPath = key->GetValue("gcc.path")->ToString();
    				 }
    
    				 key->Close();
    			 }
    
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 getGccPath();
    			 }
    	private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
    				 OpenFileDialog^ temp = gcnew OpenFileDialog;
    				 temp->Filter = "C++|*.cpp";
    				 temp->FilterIndex = 1;
    				 temp->InitialDirectory = ".";
    				 temp->Multiselect = true;
    				 if(temp->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    				 {
    					 for each(String^ t in temp->FileNames)
    					 {
    						 listBox1->Items->Add(t);
    					 }
    				 }
    			 }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(t);
    			 }
    			 compile(temp);
    		 }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    			 List<String^>^ temp;
    			 temp = gcnew List<String^>();
    			 for each(String^ t in listBox1->Items)
    			 {
    				 temp->Add(IO::Path::GetFileNameWithoutExtension(t) + ".o");
    			 }
    			 link(temp);
    		 }
    };
    }
    
    


    Markus F.
    • Als Antwort markiert Neuer_user Montag, 22. März 2010 17:55
    Montag, 22. März 2010 17:55
  • > Du solltest Process::Start verwenden und die Ausgabe umleiten, damit Du
    > diese bei Dir anzeigen kannst...

     

    Wie kann man die Ausgabe dann umleiten? (habe auch kein mingw-forum gefunden)


    Markus F.
    Montag, 22. März 2010 18:25
  • Hallo Neuer_user!

    > Wie kann man die Ausgabe dann umleiten? (habe auch kein mingw-forum
    > gefunden)

    http://msdn.microsoft.com/de-de/library/system.diagnostics.processstartinfo.redirectstandardoutput

    Jochen Kalmbach (MVP VC++)
    Montag, 22. März 2010 18:43
  • 					 Process^ myProcess = gcnew Process;
    					 ProcessStartInfo^ myProcessStartInfo = gcnew ProcessStartInfo(gccPath + "\\g++.exe", temp);
    					 myProcessStartInfo->UseShellExecute = false;
    					 myProcessStartInfo->RedirectStandardOutput = true;
    					 myProcess->StartInfo = myProcessStartInfo;
    					 myProcess->Start();
    
    					 StreamReader^ myStreamReader = myProcess->StandardOutput;
    					 // Read the standard output of the spawned process.
    					 String^ myString = myStreamReader->ReadLine();
    					 richTextBox1->Text += myString;
    					 myProcess->Close();
    --> Wenn ich das jetzt abfange macht g++ erst gar keine Ausgabe :/

    Markus F.
    Dienstag, 23. März 2010 14:01
  • Hallo Neuer_user!

    Du liest ja auch nur eine Zeile ein...
    Du solltest Dir das beispiel nochmals anschauen!

    Jochen Kalmbach (MVP VC++)
    Dienstag, 23. März 2010 14:30
  • hab ich wohl nicht geändert nach dem kopieren ^^

    das problem ist eigentlich, dass, wenn ich die Ausgabe umleite, g++ erst gar keine Ausgabe macht zumindest sehe ich keine, wenn ich das nicht mache kommt eine Ausgabe


    Markus F.
    Dienstag, 23. März 2010 14:47
  • Hallo Neuer_user!

    > das problem ist eigentlich, dass, wenn ich die Ausgabe umleite, g++ erst
    > gar keine Ausgabe macht zumindest sehe ich keine, wenn ich das nicht
    > mache kommt eine Ausgabe

    Natürlich siehst Du dann keine... sie wird ja umgeleitet...

    Jochen Kalmbach (MVP VC++)
    Dienstag, 23. März 2010 14:51
  • man muss StandardError benutzen dann gehts

    nur wird jetzt 2 mal hintereinender die gleiche Ausgabe in die textbox geschrieben


    Markus F.
    Dienstag, 23. März 2010 14:57
  • problem gelöst :)

    Markus F.
    Dienstag, 23. März 2010 18:26