Duży plik exe

dział ogólny

Duży plik exe

Nowy postprzez duf » piÄ…tek, 30 października 2009, 13:41

Piszę program i czym więcej tworzę funkcji i dodaję komponentów tym bardziej rozrasta mi sie plik exe. Ma już 3.31MB.
Zastanawia mnie jak to jest, że inne duże programy np Borland C++ mają pliki exe tylko około 900 KB.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Pitek » piÄ…tek, 30 października 2009, 14:03

Istnieje kilka programów kompresujących pliki exe np. UPX http://upx.sourceforge.net/download/upx304w.zip
Nalezy wypakować go z zip'a i w cmd przejść do folderu z upx.exe (ten folder musi zawierać twój program) napisać np. upx nazwatwojegopliku.exe
Mi skompresował 1.20MB do 415kB

Pozdro
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Cyfrowy Baron » piÄ…tek, 30 października 2009, 14:05

Gdyż, bo, że, ponieważ niektóre programy wykorzystują własne biblioteki DLL, więc zamiast ładować wszystko do jednego pliku EXE, możesz stworzyć sobie biblioteki DLL. Zmniejszy to oczywiście plik aplikacji, ale w pamięci systemowej cała aplikacja wraz z bibliotekami będzie zajmowała tyle samo lub nawet więcej miejsca niż w przypadku pojedynczego pliku EXE. Można oczywiście ładować biblioteki dynamicznie, czyli tylko wtedy gdy są potrzebne.

W celu zmniejszenia pliku aplikacji możesz użyć jakiegoś ExePackera, ale jest to forma pakowania pliku, działa dokładnie tak samo jak plik niespakowany (na ogół - dobry exepacker), lecz w pamięci zajmuje tyle samo miejsca co plik niespakowany.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
duf
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez duf » piÄ…tek, 30 października 2009, 14:24

Cyfrowy Baron napisał(a):... możesz stworzyć sobie biblioteki DLL. Można oczywiście ładować biblioteki dynamicznie, czyli tylko wtedy gdy są potrzebne.

Czym w takim razie różni się biblioteka DLL od plików .h, które są łączone z programem w czasie jego linkowania ?
A jak dynamicznie ładować biblioteki ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Cyfrowy Baron » piÄ…tek, 30 października 2009, 14:38

Nazwa biblioteka zarówno dla DLL i plików nagłówkowych *.h, *.hpp itp. nie oznacza tych samych bibliotek.



Pliki nagłówkowe – przy kompilatorze języka C i pochodnych (C++ itp.) pliki źródłowe o rozszerzeniu "h" (w C++ powinno się dla odróżnienia stosować "hpp", ale w praktyce najczęściej spotykane jest nadal rozszerzenie "h") zawierające opis interfejsu modułu: deklaracje zmiennych, funkcji, klas i innych struktur danych. Używa się ich po to, by nie trzeba było przy każdej najmniejszej zmianie w implementacji jednego modułu rekompilować wszystkich innych odwołujących się do niego. W nowszych językach takich jak Java czy C# nie ma już potrzeby stosowania plików nagłówkowych.

zaczerpnięte z Wikipedia



DLL (z ang. Dynamic-Link Library - biblioteka łączona dynamicznie) - w środowisku Windows biblioteka współdzielona (z ang. shared library), która przechowuje implementacje różnych funkcji (podprogramów) programu i/lub zasoby programu. Funkcje i zasoby zawarte w bibliotece DLL mogą być wykorzystane bezpośrednio lub pośrednio (za pośrednictwem innej biblioteki DLL) przez dowolny plik wykonywalny, sama biblioteka DLL nie jest samodzielnym programem.

zaczerpnięte z Wikipedia



O tworzeniu bibliotek DLL i dynamicznym podłączaniu przeczytasz w serwisie Cyfrowy Baron w dziale: Teoria -> Tworzenie DLL.



Dziś, gdy normą jest 2GB RAM-u nie przejmowałbym się specjalnie oszczędzaniem tej pamięci. W przypadku małych aplikacji niewiele zyskasz, a wiele sobie skomplikujesz. To ma sens gdy aplikacji jest mocno rozrośnięta, lub gdy liczba udostępnianych funkcji jest duża.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez duf » niedziela, 1 listopada 2009, 09:53

Dzięki za info. Zrobiłem ćwiczenia z tematu dynamiczne podłączanie biblioteki dll i mam pytanie. jak do gotowego już projektu wygenerować i podłączyć dynamicznie dll ?
Zrobiłem nowy projekt okna z labelem:
Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
extern  "C"  __declspec(dllexport) void About();
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HANDLE DLLHandle = LoadLibrary("E:\\Moje Dokumenty\\RAD Studio\\Projects\\ĆWICZENIA\\DLL\\cw\\dll\\Debug\\Project1.dll");

if(DLLHandle != NULL)
{
  typedef (*aAbout)(); // Deklaracja wskaźnika do funkcji.

  aAbout About = (aAbout)GetProcAddress(DLLHandle, "_About");

  if(About != NULL)  About();
}
else // jeśli nie znaleziono biblioteki.
{
  ShowMessage("Nie znaleziono wymaganej biblioteki 'Project1.dll'");
}
FreeLibrary(DLLHandle); // usunięcie biblioteki z pamięci, gdy jest już zbędna.
}
//---------------------------------------------------------------------------


Następnie utworzyłem nowy projekt dll:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include "Unit1.h"
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
extern  "C"  __declspec(dllexport) void About();
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}
//---------------------------------------------------------------------------
void About()
{
Form1->Label1->Caption = "A";
}

Dołączyłem poprzez include Unit1.h i do folderu gdzie zapisałem project dll przekopiowałem plik Unit1.h z pierwszego projektu żeby kompilator się nie czepiał.
Po skompilowaniu projektu z oknem label1 nie zmienia swego napisu na "A". Czego nie zrobiłem właściwie ?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Cyfrowy Baron » niedziela, 1 listopada 2009, 11:18

Dzięki za info. Zrobiłem ćwiczenia z tematu dynamiczne podłączanie biblioteki dll i mam pytanie. jak do gotowego już projektu wygenerować i podłączyć dynamicznie dll ?


Nie rozumiem pytania. Przecież piszesz, że ćwiczyłeś dynamiczne podłączanie biblioteki, więc już wiesz jak ja podłączać dynamicznie. Na etapie tworzenia aplikacji musisz uwzględnić w kodzie podłączenie biblioteki, niezależnie czy jest podłączana dynamicznie czy nie.

Czy przez gotowy projekt rozumiesz skompilowaną i gotowy do pracy program? Jeżeli TAK, to jeśli nie uwzględniłeś w takim programie podłączenia biblioteki, to jej nie podłączysz, chyba, że znasz się na informatycznych cudach.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez duf » niedziela, 1 listopada 2009, 16:45

To może raz jeszcze spróbuję zadać pytanie.
Tworzę projekt najprostszy VCL Forms Application. Na formie kładę Button1 i Label1. Program kompiluje i jest gotowy. Zawsze mogę wrócić do kodu źródłowego i zmienić lub dodać instrukcję. Teraz Tworzę nowy projekt Dynamic-Link Library. Jak podłączyć pierwszy projekt do projektu dll ? Samo include "Unit1.h" nie wystarczy bo kompilator nie widzi zmiennych z Unit1.h. Pytam bo nie wiem.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Cyfrowy Baron » niedziela, 1 listopada 2009, 19:07

Ty chyba nie zrozumiałeś tego artykułu o dynamicznym podłączaniu bibliotek DLL.

Masz gotową bibliotekę z funkcjami. To program odwołuje się do funkcji w bibliotece, a nie biblioteka do funkcji w programie, więc tworząc lub modyfikując projekt programu umieszczasz w nim kod podłączający bibliotekę i nie ma znaczenia, czy podłączasz ja dynamicznie czy nie, musisz umieścić w projekcie funkcje podłączające bibliotekę.

Biblioteka DLL nie działa tak jak biblioteki *.H i *.HPP i nie da się ich w ten sam sposób używać.

O dynamicznym podłączaniu bibliotek przeczytasz w serwisie Cyfrowy Baron w dziale: teoria -> dynamiczne podłączanie biblioteki DLL.

Tam jest dokładnie podane jak należy podłączać bibliotekę DLL dynamicznie i nie potrzeba niczego więcej, jeżeli zrobisz tak jak tam zostało to opisane to będzie działać. Jeżeli nie rozumiesz to daj sobie z tym spokój...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez duf » poniedziaÅ‚ek, 2 listopada 2009, 12:44

Nie dałem sobie spokoju i ...
Znalazłem rozwiązanie. Do projektu dll należy poprzez Add Existing Project dołączyć poprzedni projekt i można hulać.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    NieznanyNieznana

Re: Duży plik exe

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 2 listopada 2009, 14:27

Im więcej czytam o tym co kombinujesz tym mniej rozumiem o co Tobie właściwie chodzi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości