Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

kopia konsoli CMD w C++ z dodatkowymi funkcjami.

Cor-Dell 02 Wrz 2017 11:52 582 8
  • #1 02 Wrz 2017 11:52
    Cor-Dell
    Poziom 6  

    Witam.
    Chciałbym stworzyć w pełni użyteczną konsolę w cmd i wyposażyć ją w dodatkowe funkcje.

    Ma ktoś pomysł, jak to zrobić szybko i bezboleśnie.
    Wywoływanie wszystkich komend przez funkcje "system" rodzi pewne problemy : /
    i tak wywołane funkcje nie zawsze zachowują się tak jak w oryginalnej konsoli.

    Podziękowania, JacekCz za zwrócenie mi uwagi na ten problem.

    0 8
  • #2 02 Wrz 2017 12:44
    maly_ninja
    Poziom 12  

    W jakie dodatkowe funkcje chcesz ją wyposażyć? Przecież te wszystko komendy nie są w konsoli, tylko są to osobne programy wywoływane za pomocą konsoli.

    0
  • Pomocny post
    #3 02 Wrz 2017 12:56
    JacekCz
    Poziom 35  

    Problemy z funckją system()

    system() jak sie wczytać w dokumentacje / implementacje (DOS/Windows/Linuxy) wywołuje procesor komend właściwy dla systemu przekazując mu string

    i tak

    Kod: dos
    Zaloguj się, aby zobaczyć kod

    Na dos / win wywoła coś w rodzaju (przepraszam, o tych tematach myślę na sposób DOS) (echo jest wbudowane)
    Kod: dos
    Zaloguj się, aby zobaczyć kod
    albo
    Kod: dos
    Zaloguj się, aby zobaczyć kod

    na linuksach być może ostateczny program "echo"

    system("alamakota") wywoła dwa programy po kolei "na stosie".

    To problem wydajnościowy oraz formalny. Gorsze, bo system() jest odpalane, instancja procesora komend powoływana, coś się dzieje, i instancja jest niszczona, a programista by chciał by pozostały z tego efekty

    Rodzina funkcji gdzie jest większa kontrola to execXxxx spawnXxxx i pochodne, zarys jest tutaj:
    https://en.wikipedia.org/wiki/Exec_(system_call)

    Tu wywołanie programu zewnętrznego "alamakota" jest bezpośrednie.
    Na pewno ta rodzina funkcji Ci pozwoli wywołać twoje "rozszerzenie" inaczej niż "program zewnętrzny", czy wywołac program w bardzo precyzyjnie skrojonym środowisku ... do dziś scyzoryk mi się otwiera, jak w necie widzę geniuszy, którzy robią "wysoko zoptymalizowany" program w C, bo "C jest najszybsze" i tam są kwiatki jak system("cls")

    Na przykład kod zakończenia programu tu działa zgodnie z oczekiwaniem

    Nie znaczy to, że mam wizję "zamiennika cmd.exe", bo na kilku "hakach" bym poległ, np nie wiem jak się zachować, jak wywoływany program zmienia zmienne środowiska (SET). Nie umiem na kolanie tego wymyślić.

    c.d. chyba nastapi

    maly_ninja napisał:
    W jakie dodatkowe funkcje chcesz ją wyposażyć? Przecież te wszystko komendy nie są w konsoli, tylko są to osobne programy wywoływane za pomocą konsoli.


    własnie nie "wszystko". W Unixach była by to (prawie) dobra odpowiedź, chyba tylko "set" jest wbudowane, w DOS/Win wbudowanych jest więcej: dir, set, cls, echo i jeszcze inne, to już sobie znajdziecie

    EDIT:
    za DOS-a jak wymiękał comand.com, używało się tego: https://pl.wikipedia.org/wiki/4DOS i to był bardzo szanowany program - obecnie opensource. Może jakieś haczyki da się podejrzeć?

    0
  • Pomocny post
    #4 02 Wrz 2017 14:48
    sylvi91
    Poziom 14  

    Nie za bardzo zrozumiałem z początku o co chodzi i jakie są twoje zamierzenia.
    Ale widzę, że chcesz pisać jakby nowy "Command.com". Tylko po co? Dla windowsa są programy lub kolekcje narzedzi o rozszerzonych możliwościach w porównaniu do CMD.

    W czystym C++ nowej konsoli windowsowej nie stworzysz, bo to będzie tak naprawdę program dla Windows.
    Musiałbyś chyba pisać od nowa posługując się Win API. Mógłbyś w ten sposób rozszerzyć możliwości linii komend o możliwości posługiwania się formatowaniem wprowadzanego tekstu i generalnie związanych z interfejsem użytkownika. Dokonać zmian wielkości bufora wprowadzanych znaków, przewijania ekranu z wprowadzonymi znakami, zachowania się w przypadku wprowadzenia znaków, zmienić sposób uruchamiania nowych procesów, umożliwić logowanie się użytkowników itp.
    Tutaj jest opis funkcji API. https://docs.microsoft.com/en-us/windows/console/
    Większość chyba wykorzystuje bibliotekę Kernel32. To jest jednak zamknięty kod źródłowy.

    Zwróć uwagę na środowisko Cygwin, które oferuje mnóstwo funkcji dzięki wsparciu programistów tworzących kod "open source". To wszystko to zbiór odpowiednich bibliotek i korzystających z nich aplikacji dających pod Windowsem funkcjonalność z Linuxa.

    Posługując się językiem programowania C lub C++ i odpowiednimi środowiskami programowania. można dodawać nowe funkcje do linii poleceń pisząc nowe programy wykonywalne .exe lub .com. (oddzielne pliki binarne). Taki program uruchamiany z linii poleceń zaczyna się zwyczajowo od funkcji main(). Ale to wiesz.

    Sugerowałbym tutaj napisanie kilku aplikacji C++ dla terminala w środowisku Code::Blocks (GNU Compiler) i podzielenie się wkładem pracy. Udostępnieniem kodu źródłowego w celu przeniesienia na inne platformy.

    Jeżeli jednak wolisz pisać swoją całkiem nową powłokę systemową to poczytaj o BASH. https://pl.wikipedia.org/wiki/Bash

    Wspomniany 4DOS jest pisany jest głównie pascalu i asemblerze i coś tam w C i też nie jest to jednolity plik wykonywalny Windowsa, tylko kolekcja/zbiór narzedzi.

    0
  • #5 02 Wrz 2017 16:23
    Cor-Dell
    Poziom 6  

    docelowo to chciałbym napisać program do zarządzania skryptami... pod autocada, excela, i rhino 3d... dla firm z którymi współpracuje...
    ale to zupełnie inna historia... teraz uczę się c++ ... i przygotowanie takiej konsoli ... traktuje jako jeden z etapów tej nauki ... gdzie przy okazji dodaje sobie funkcje które mi się przydadzą w finalnym projekcie.

    0
  • #6 02 Wrz 2017 17:36
    JacekCz
    Poziom 35  

    Cor-Dell napisał:
    docelowo to chciałbym napisać program do zarządzania skryptami... pod autocada, excela, i rhino 3d... dla firm z którymi współpracuje...
    ale to zupełnie inna historia... teraz uczę się c++ ... i przygotowanie takiej konsoli ... traktuje jako jeden z etapów tej nauki ... gdzie przy okazji dodaje sobie funkcje które mi się przydadzą w finalnym projekcie.


    Ale SVN i GIT już jest wynaleziony :) *)

    Od lat mam przeświadczenie, że "uczenie się C++" a intensywne męczenie API do np jak tutaj mowa Win32 to jest antydydaktyczne. Chyba żadne API nie jest w poszanowaniu dobrego standardowego C++, o ile w ogóle jest w C++

    Rada @sylvi91 wejścia w jakiś dobry projekt opensursowy jest bardzo dobra. Żadna wspólnota (dobrego) projektu o.s. nie wybaczy sieczki jaką zwykle odstawiamy sami przed sobą w cichości własnej izdebki. Wpasowanie się w zasady projektu (poczynając od takich bzdur jak wcięcia w kodzie), nawet jeśli by nie były idealne, to jest dobry rozwój dla programisty

    *) Jak chcesz w przyszłości miec jakąs nadbudowę nad skryptami (cokolwiek), możesz aplikować / dodawać wtyczki do jakiegoś edytora programistycznego. Mialem pozytywne romanse z Scintilla/Scite, JEdit

    0
  • #7 02 Wrz 2017 18:13
    Cor-Dell
    Poziom 6  

    hah zapewniam że daleko mi do intensywnego męczenia API, interesują mnie tylko podstawy: D

    o "Cygwin" nie słyszałem ale się zainteresuje. Dzięki panowie za dobre rady.

    pozdrawiam.

    0
  • #8 02 Wrz 2017 22:56
    sylvi91
    Poziom 14  

    Cor-Dell napisał:
    hah zapewniam że daleko mi do intensywnego męczenia API, interesują mnie tylko podstawy: D
    Ale bez tego się raczej nie obejdzie przy pisaniu takiego rodzaju programu.

    Cytat:

    o "Cygwin" nie słyszałem ale się zainteresuje. Dzięki panowie za dobre rady.
    Tak, warto zapoznać się z Cygwinem, a w twoim przypadku szczególnie z "mintty". https://en.wikipedia.org/wiki/Mintty
    Kod źródłowy jest dostępny tutaj https://github.com/mintty/mintty/releases

    0
  • #9 03 Wrz 2017 12:10
    JacekCz
    Poziom 35  

    sylvi91 napisał:
    Cor-Dell napisał:
    hah zapewniam że daleko mi do intensywnego męczenia API, interesują mnie tylko podstawy: D
    Ale bez tego się raczej nie obejdzie przy pisaniu takiego rodzaju programu.

    Cytat:

    o "Cygwin" nie słyszałem ale się zainteresuje. Dzięki panowie za dobre rady.
    Tak, warto zapoznać się z Cygwinem, a w twoim przypadku szczególnie z "mintty". https://en.wikipedia.org/wiki/Mintty
    Kod źródłowy jest dostępny tutaj https://github.com/mintty/mintty/releases


    1. Miałem również i to na myśli, że intensywna nauka jakiegoś API zwykle nie pokrywa się z nauką dobrego C++ (a to deklarujesz), to sa ważne ale często rozbieżne dziedziny

    2. Rada @sylvi91 co do elementów Cygwin'a ma sens (choć ja nie znam bebechów).
    Sugerowanego przeze mnie 4DOS-a używałem, ale nigdy nie hackowałem, skoro jest jak piszesz, nie rekomenduję.

    0