Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 15 z 17

Temat: [C++] Program generujący gotowy plik wykonywalny ...

  1. #1
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie [C++] Program generujący gotowy plik wykonywalny ...

    Tak więc, chcę w C++ napisać program, który wygeneruje plik wykonywalny o wcześniej ustalonym kodzie źródłowym.

    kura.exe - program generujący
    jajko.exe - plik wykonywalny utworzony kurą.

    Po skompilowaniu chce uzyskać :
    - plik kura.exe i jak to kura chce, żeby już miała w sobie jajko.exe
    - po uruchomieniu kura.exe, chce aby wykonała swój własny kod i potem przykładowo po 3000 ms kurka, zniosła jajko.


    Nie potrzebuję wszystkiego, chcę tylko znać kod na "generację" pliku wykonywalnego o zawsze tym samym kodzie.

    Z góry dziękuję za wszelkie sugestie i ewentualne linki gdzie mógłbym o tym poczytać (po angielsku też może być).

  2. #2
    Dawni Moderatorzy
    Dołączył
    11-11-2006
    Skąd
    Polska
    Posty
    562

    Domyślnie

    a czy jajko zawsze będzie takie samo? jeli tak to mozesz użyć zasobów.

  3. #3
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Jajko zawsze będzie miało ten sam kod.
    Zmieniany tylko przez zmianę źródeł i ponowną kompilację.

    Tzn. konkretniej - jakiś link ?

  4. #4
    Użytkownik
    Dołączył
    10-07-2007
    Posty
    33

    Domyślnie

    Hm, najprostszym sposobem to chyba by było: napisać jakiś program hello world - dla jajak, skompilować go, edytować plik *.exe skopiować jego zawartość, następnie w programie kura zrobić:

    Kod:
    std::ofstream data("jajko.exe");
    
    
    
    data << skopiowana_zawartosc_jajko_exe;
    
    
    
    data.close();
    Nie gwarantuję, że to zadziała

  5. #5
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Kod:
    #include <stdio.h>
    
    int main() {
    
    ****FILE *f = fopen("jajko.exe", "wb");**// otworzenie pliku
    
    ****if (f) {
    
    ********fputs("moja treść", f); // zapisanie do pliku
    
    ********fclose(f);**// zamknięcie pliku i zapisanie zmian
    
    ****}
    
    ****return 0;
    
    }
    Tak chyba sobie poradzę, problem mam tylko z skopiowaniu z win hexa lub notatnika treści jajka.

    Kopiuje mnie się tylko pierwszy blok :MZ�

    A więc Hex edytorem powiedzmy, że sobie poradziłem :
    Copy Editor Display i musiałem usuwać nie krótkó linijeczkę z kodem ANSI..

    A teraz problemy :
    Po utworzeniu pliku z kodem Nie daje to pożądanego efektu (efekt taki jak bym wklepał tekst ..)
    Kolejny problem to to, że w ASCI pojawia się co jakiś czas Q lub $ przez co dev się krztusi i nie pozwala skompilować.

    Czekam na mini propozycję.

  6. #6
    Użytkownik
    Dołączył
    11-07-2007
    Posty
    12

    Domyślnie

    Łatwiej bedzie skorzystać z zasobów:
    wersja dla delphi i buildera [ANG]

    Tworzysz jajko.exe
    Pakujesz do jajko.res
    Do projektu kura dodajesz jajko.res i z poziomu kodu kura zapisujesz na dysk jajko.exe

    ---------
    Widze ze tam nie ma przykladu z EXE wiec dla Buildera bedzie cos takiego

    Kod:
    TResourceStream *fs = new TResourceStream((int)HInstance,"nazwa_z_pliku_RC","exe");** fs->SaveToFile("c:jajko.exe");**
    
    delete** fs;

  7. #7
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    RES - skrót od angielskiego słowa RESOURCE znaczy "źródło". Na pomysła na taki plik wpadli łepki z Microsoftu miał on umożliwić wstawienie do Windows-owego 32-Bitowego pliku wykonywalnego (*.exe, *.dll, *, ocx), innego dowolnego formatu pliku (np. Wav, Bmp, MP3 itp.),[/b]
    To pierwsze, a drugie to sposób podłączania (przykładowy):

    Kod:
    #include <vcl.h>
    
    #include <windows.h>
    
    #pragma hdrstop
    
    #pragma argsused
    
    #pragma resource "UPCDEMO.RES" // YOU ONLY NEED TO ADD THIS LINE.
    
    
    
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    
    ****{
    
    ****return 1;
    
    ****}
    Piszę pod dev'em, więc jestem gotów się założyć, że vcl.h różni się od tego z borlanda.

    A po 3.
    Oni określają się, że to wszystko tyczy się obiektów obrazków itd., a tutaj chodziło przede wszystkim o treść pliku i chyba jestem przy tępy, ale zrozumiałem, że plik res będzie nieodzownym plikiem przy każdorazowym uruchomieniu exe (kura), a mnie chodzi o posiadanie tylko 1 pliku.

  8. #8
    Użytkownik
    Dołączył
    11-07-2007
    Posty
    12

    Domyślnie

    OK chwilka bo tak czytam Twój pierwszy post i ostatni i tak...

    Po skompilowaniu chce uzyskać :
    - plik kura.exe i jak to kura chce, żeby już miała w sobie jajko.exe
    - po uruchomieniu kura.exe, chce aby wykonała swój własny kod i potem przykładowo po 3000 ms kurka, zniosła jajko.[/b]
    OK to jak skorzystasz z zasobów to bedzie miał kura.exe a w nim jajko.exe.

    ...ale zrozumiałem, że plik res będzie nieodzownym plikiem przy każdorazowym uruchomieniu exe (kura), a mnie chodzi o posiadanie tylko 1 pliku.[/b]
    Jęśli dobrze zrozumialem to obawiasz sie ze twój App bedzie sie skladał z plików kura.exe + jajko.res .... Tak nie bedzie zostanie sam plik kura.exe. Plik *.res jest potrzebny podczas kompilacji i tylko wtedy.

    Pozatym tez za kazdym razem jajko nie musi byc wypakowywane z kura.exe (jeśli też nad tym sie zastanawiasz) to ustalasz w kodzie kury i mozesz uzależnić od jakiegoś warunku. Czyli np jak jajko istnieje to nie składaj nowego a jak nie ma to złuż

  9. #9
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Czyli z Resource już wiem.

    Teraz tylko dwie rzeczy :
    Kod:
    #include <vcl.h>
    
    #include <windows.h>
    
    #pragma hdrstop
    
    #pragma argsused
    
    #pragma resource "UPCDEMO.RES" // YOU ONLY NEED TO ADD THIS LINE.
    
    
    
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    
    ****{
    
    ****return 1;
    
    ****}
    Zastanawiam się nad tym, czy skompiluje to pod devem (widzę funkcję winapi, czyli trzeba będzie przejść na WIN32 GUI z wsparciem dla tematów Windows XP).
    Jakieś wskazówki ?

  10. #10
    Użytkownik
    Dołączył
    11-07-2007
    Posty
    12

    Domyślnie

    Po pierwsze to tak:

    Resource (.res) files are an intermediate container for resources such as bitmaps or text, which may later be compiled into applications, components, or DLLs.[/b]
    Czyli ta funkcja cie nie obchodzi bo nie chcesz zasobów mieć w osobnej bibliotece DLL tylko w samym exe. Bo ta funkcja została tam umieszczona jak dobrze mniewam dla przpadku checi utworzenia pliku dll. Jak chcesz z nich skorzystać w tworzonym projekcie to dodajesz tą dyrektywe co tam jest oznaczona, a potem już tworzysz obiekt klasy TResourceStream jak pisalem.

    Ale to nie zmienia faktu iż w Dev'ie moze sie nie udać przygoda z Resources ... nie wiem bo nie korzystam ale może tam nie być czegoś takiego jak klasa TResourceStream. Ale nawet gdyby to weź sobie Borlanda w wersji Personal za free zassaj i po kłopocie

  11. #11
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Problem w tym, że wszystko co robię jest już przygotowane pod dev'a.
    Przejście z tym na borlanda to już jest nie wykonywalne.

    To może jednak odsuniemy się od źródełek .res.
    Ma ktoś jakiś pomysł, żeby zawartość jajka po jego utworzeniu w tym kodzie :

    Kod:
    #include <stdio.h>
    
    int main() {
    
    ****FILE *f = fopen("jajko.exe", "wb");**// otworzenie pliku
    
    ****if (f) {
    
    ********fputs("moja treść", f); // zapisanie do pliku
    
    ********fclose(f);**// zamknięcie pliku i zapisanie zmian
    
    ****}
    
    ****return 0;
    
    }
    Była wykonywalna i plik jajko.exe nie był traktowany jak zwykły txt ?

  12. #12
    Użytkownik
    Dołączył
    11-07-2007
    Posty
    12

    Domyślnie

    Tu masz kod przy użyciu biblioteki fstream - standardowa klasa do obsługi plików w C++.
    Plik jajko2.exe robi sie i działa prawidłowo. Probowalem na notepad.exe.

    Kod:
    #include <fstream.h>
    
    
    
    int main()
    
    {
    
    **fstream filestr, filestr2;
    
    **int length;
    
    **char * buffer;
    
    
    
    **filestr.open("jajko.exe", fstream::in | fstream::binary);
    
    
    
    **filestr.seekg (0, ios::end);****//ustaw na koniec
    
    **length = filestr.tellg();****** //podaj dlugosc
    
    **filestr.seekg (0, ios::beg);****//powrót na poczatek
    
    
    
    **buffer = new char[length];******//alokacja memorsa
    
    **filestr.read(buffer,length);****//zczytanie jaja
    
    **filestr.close();
    
    
    
    **//wpisanie jaja do 2 strumienia z bufora
    
    **filestr2.open("jajko2.exe", fstream::out | fstream::binary);
    
    **filestr2.write(buffer,length);
    
    **filestr2.close();
    
    }

  13. #13
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Ale jestem kłopotliwy ..
    Kod:
    #include <fstream.h>
    
    
    
    int main()
    
    {
    
    **fstream filestr, filestr2;
    
    **int length;
    
    **char * buffer;
    
    
    
    **filestr.open("jajko.exe", fstream::in | fstream::binary);
    
    
    
    **filestr.seekg (16481, ios::end);****//ustaw na koniec
    
    **length = filestr.tellg(16481);****** //podaj dlugosc
    
    **filestr.seekg (0, ios::beg);****//powrót na poczatek
    
    
    
    **buffer = new char[length];******//alokacja memorsa
    
    **filestr.read(buffer,length);****//zczytanie jaja
    
    **filestr.close();
    
    
    
    **//wpisanie jaja do 2 strumienia z bufora
    
    **filestr2.open("jajko2.exe", fstream::out | fstream::binary);
    
    **filestr2.write(buffer,length);
    
    **filestr2.close();
    
    }
    plik ma 16482 bajtów

    przy kompilacji devem :
    1 Cev-Cppincludec++3.4.2backwardfstream.h:31, from kuranew.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/fstream.h:31, from kuranew.cpp
    1 D:cppkuranew.cpp from kuranew.cpp
    32:2 Cev-Cppincludec++3.4.2backwardbackward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
    D:cppkuranew.cpp In function `int main()':
    11 D:cppkuranew.cpp `ios' has not been declared
    11 D:cppkuranew.cpp `end' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    12 D:cppkuranew.cpp no matching function for call to `std::basic_fstream<char, std::char_traits<char> >::tellg(int)'
    note Cev-Cppincludec++3.4.2bitsistream.tcc:847 candidates are: typename std::basic_istream<_CharT, _Traits>:os_type std::basic_istream<_CharT, _Traits>::tellg() [with _CharT = char, _Traits = std::char_traits<char>]
    13 D:cppkuranew.cpp `ios' has not been declared
    13 D:cppkuranew.cpp `beg' undeclared (first use this function)
    D:cppMakefile.win [Build Error] [kuranew.o] Error 1[/b]
    W czym błąd robię ?

  14. #14
    Użytkownik
    Dołączył
    11-07-2007
    Posty
    12

    Domyślnie

    He he już sobie specjalnie tego Dev'a zainstalowałem

    mam taki kod i dziala, przyklad na notatniku. I jak chcesz na sztywno rozmiar pliku to daj tak ja teraz dałem.

    Kod:
    #include <cstdlib>
    
    #include <iostream>
    
    #include <fstream> 
    
    
    
    using namespace std;
    
    
    
    int main()
    
    {
    
    **fstream filestr, filestr2;
    
    **int length;
    
    **char * buffer;
    
    
    
    **filestr.open("jajko.exe", fstream::in | fstream::binary);
    
    
    
    **length = 73728; 
    
    
    
    **buffer = new char[length];******//alokacja memorsa
    
    **filestr.read(buffer,length);****//zczytanie jaja
    
    **filestr.close();
    
    
    
    **//wpisanie jaja do 2 strumienia z bufora
    
    **filestr2.open("jajko2.exe", fstream::out | fstream::binary);
    
    **filestr2.write(buffer,length);
    
    **filestr2.close(); 
    
    **system("PAUSE");
    
    **return EXIT_SUCCESS;
    
    }
    No a jak rozmiar ma nie być na sztywno to zostaw tak jak wtedy, tez działa.

  15. #15
    Użytkownik
    Dołączył
    11-02-2007
    Posty
    28

    Domyślnie

    Zgadza się, teraz wszystko działa pięknie
    Są trzy pliki :

    Kura.exe
    jajko.exe
    jajko2.exe

    Gdy zostaje samo kura.exe
    To nie z czyta jajko.exe
    i pomimo iż powstanie jajko2.exe
    to będzie wypełnione samymi nulami.

Podobne wątki

  1. dll + plik wykonywalny
    Przez gelman
    w forum Bindery
    Odpowiedzi: 14
    Ostatni post / autor: 23-07-2010, 11:43
  2. GG, program tworzący plik .jpg
    Przez orzel24
    w forum Komunikatory
    Odpowiedzi: 8
    Ostatni post / autor: 23-07-2007, 11:05
  3. Mam ggt 2.2.. i jedne plik k wykonywalny.. a teraz pytanie..
    Przez magiclabs
    w forum Trojany - zdalna administracja
    Odpowiedzi: 3
    Ostatni post / autor: 16-11-2006, 17:34
  4. [Pascal] Program, który usunie pewien plik...
    Przez BackPack
    w forum Delphi/Pascal
    Odpowiedzi: 4
    Ostatni post / autor: 21-05-2006, 18:12
  5. program ktory przerobi plik pdf na doc
    Przez CyberTommy
    w forum Inne
    Odpowiedzi: 8
    Ostatni post / autor: 09-11-2005, 14:24

Uprawnienia

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •