Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
wolfalone
В экстазе
142 / 126 / 26
Регистрация: 05.08.2012
Сообщений: 653
Записей в блоге: 3
#1

Как создают маленькие приложения? (размером до ~50-70Кб) - C++

17.08.2012, 15:07. Просмотров 3103. Ответов 38
Метки нет (Все метки)

Доброго времени суток! Этот вопрос (Subject) меня интересует уже достаточно давно. Мне постоянно попадаются разнообразные оконные приложения, например:

1. FreeMemory
2. Разнообразные модули инсталляторов
3. Модули самораспаковывающихся архивов
4. И множество других приложений

Всех их объединяют 2 факта:
1. Они используют оконные интерфейсы (так же, не редко умеют "показывать картинки", распаковывать архивы, и выполнять множество прочих функций)
2. При этом занимают 30-70Кб
3. Не требуют "дополнительных" библиотек, то есть, грубо говоря, запускаются на Windows вплоть до версии Win9x без необходимости "доустановки" чего-то ещё.

Конечно, наиболее рациональный вариант, это писать на "голом Win32 API" и так далее. Но, лично мне вериться с трудом в то, что авторы всех этих программ методично и муторно использовали "голый" Win32 API (и, если следовать этой логике. то некоторые, ещё и написали свои собственные "контролы").

Размер готовых приложений, тестировал буквально во всем (везде), что (где) мог найти (всяческие компиляторы + разнообразные примеры, разнообразные IDE и прочие "плюшки").

Собственно, под "проверку" попали:
1. Visual Studio (разные версии)
2. CodeBlocks + MinGW + разнообразные оконные фреймворки
3. QT Creator
4. Borland C++ Builder

Ничего из выше перечисленного, почему-то не генерирует .EXE, со статической линковкой (даже после сжатия каким-нибудь UPX'ом), который бы занимал не более 70Кб и при этом обладал хотя бы частью функционала описанного выше. В лучшем случае, удаётся сжать программу килобайт эдак в 200.

Собственно, вопрос. На чем (как) пишутся подобные программы? Какая используется при этом IDE, компилятор и пр. "плюшки"? То есть, как можно уместить "де-архиватор" + штуковину, отображающую картинку в качестве заставки (сплэш-скрин) и ещё кучу всякого функционала (работа с реестром, ини-файлы, и пр.) в 50Кб? Ассемблер+WinAPI наше всё?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2012, 15:07     Как создают маленькие приложения? (размером до ~50-70Кб)
Посмотрите здесь:

C++ Можно ли коробку размером a\b\c упаковать в посылку размером r\s\t ?
Как создают современные компьютерные игры? C++
Подскажите, как скрыть окно приложения из Диспетчер задач -> Приложения? C++ WinAPI
Из заданной матрицы A размером получить матрицу В размером по правилу: первый столбец состоит из положительных элементов, второй – из отрицате C++
C++ Из заданной матрицы A размером N*M получить матрицу В размером K*3 по правилу: первый столбец состоит из полож
Геттеры создают объекты C++
C++ Builder Определить какую фигуру создают точки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
19.08.2012, 11:50     Как создают маленькие приложения? (размером до ~50-70Кб) #21
wolfalone, разговор начинает напоминать разговор слепого с глухим. Я тебе об одном, а ты о другом. Давай чтобы не распространяться я покажу конкретный пример и задам конкретный вопрос. Я не программирую под виндами, а потому попросту не знаю, как этот вопрос сформулировать в контексте винды и любой их IDE. Вопрос ставится в контексте линукса, тем более, что с ним ты знаком

Имеется пример:

C
#include <string.h>
 
int main (void)
{
  int x = 0;
 
  if (x)
    strcasestr(0, 0);
 
  return 0;
}
Компилируем его в режиме с оптимизациями и без оптимизаций. В обоих случаях используем статическую линковку, чтобы итоговый бинарник не зависел от внешних библиотек. Далее сравниваем размеры, полученные в обоих случаях

Bash
$ gcc t.c -static
$ ls -l a.out
... 586230 ...
$ gcc -O2 t.c -static
$ ls -l a.out
... 577892 ...
Вопрос N1. Почему включение оптимизаций для исходника из трёх строк размер бинарника уменьшился аж на 8 килобайт?

Вопрос N2. Почему при замене strcasestr на strstr данный эффект не проявляется?

Ну и скажу сразу, в хидерах оба интерфейса описаны как функции, но не макросы, из-за чего мог бы возникнуть такой эффект

Цитата Сообщение от wolfalone Посмотреть сообщение
Собственно, отсуда и подобный вопрос: как авторам программ (для примера возьмём модули инсталляторов или самораспаковывающихся архивов), удаётся достичь столь мирезных размеров приложения? Они используют чистый WinAPI?
Причина в том, что они НЕ используют сторонних библиотек. Библиотеки, как правило, никаких новых принципиальных возможностей не дают, а просто делают программирование более удобным, поскольку winapi неудобен для программирования. Возможно ты когда-нибудь обращал внимание на то, что программы, написанные на чистом винапи, как правило, являются очень топорными с точки зрения удобства пользования (либо слишком примитивными, а потому удобный пользовательский интерфейс там и не нужен). Всё это растёт от того, что чистый винапи неудобен для программирования, особенно больших приложений

Добавлено через 22 минуты
Ну и добавлю, что причины, по которым использование библиотек (типа VCL) раздувает бинарник, примерно те же самые, что и причины в моём примере. И в основе всего лежит одна и та же штука: в полученном бинарнике много кода, который твоя программа никогда не исполнит, но который пришлось прилинковать к бинарнику
ExeiLj
8 / 8 / 1
Регистрация: 02.08.2012
Сообщений: 128
23.08.2012, 17:23     Как создают маленькие приложения? (размером до ~50-70Кб) #22
Почитал тему - довольно интересно.
Так может кто скажет, как настроить Embarcadero RAD Studio, чтобы компилить малые проги (пусть даже только с WinAPI)?
Когда я копилю пустую прогу в VCL Form Application, то получается 300+ кб, в Консоли 7кб. А я читал, что прога (пустая) может весить 1кб! Как этого добиться?

PS: интересно мнение программистов: у меня прога выполняет банальное чтение данных с реестра и при компиляции ехе весит 3мб - Этож блин дофига!!! (VCL Form Application)
Дак вот стоит ли переделывать все на чистый ВинАПИ, в консоли писать вручную окна, чтобы она весила килобайты? или это глупое задротство?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
23.08.2012, 17:32     Как создают маленькие приложения? (размером до ~50-70Кб) #23
ExeiLj, А зачем? Сейчас винты на террабайты, а вы о 3 мб беспокоитесь.
ExeiLj
8 / 8 / 1
Регистрация: 02.08.2012
Сообщений: 128
23.08.2012, 17:40     Как создают маленькие приложения? (размером до ~50-70Кб) #24
Цитата Сообщение от ForEveR Посмотреть сообщение
ExeiLj, А зачем? Сейчас винты на террабайты, а вы о 3 мб беспокоитесь.
Просто мне это кажется...ммм...не знаю, не по-трукодерски, что такой маленький функционал и такой вес программки
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
23.08.2012, 18:40     Как создают маленькие приложения? (размером до ~50-70Кб) #25
Цитата Сообщение от ExeiLj Посмотреть сообщение
Когда я копилю пустую прогу в VCL Form Application
Вот это и есть ключевое слово. У тебя есть библиотека. При этом линкер не знает, будешь ты оттуда что-то использовать, или не будешь, а потому по общим правилам прилинкует. Именно в этом причина вопроса N1 из поста #21 - у тебя номинально в коде присутствует вызов, а потому библиотека с данной функцией будет подцеплена. И не важно, что реально до этой функции исполнение не дойдёт.

Когда ты используешь VCL, то у тебя аналогичным образом цепляется целый паровоз всякого барахла, зацепленный, условно говоря, за какую-нибудь одну функцию инициализации. Да и в моём примере на Си было то же самое - пустой main, а код получился на 500 килобайт, только вместо VCL там имеется целый паровоз всяких инициализаций системной библиотеки glibc
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
23.08.2012, 18:41     Как создают маленькие приложения? (размером до ~50-70Кб) #26
Одно дело вызвать библиотеку рисующую окна и использовать 5% её возможностей, а остальное просто балласт.
Другое дело создать своё окно по методам линий и заливок.
Третье, разобрать библиотеку и повырезать всё ненужное, оставить только под свои нужды...

Да и вообще, знать низкоуровневое программирование это хорошо, но если ваша задача состоит в какой-то дурне или безделушке которых в интернете полно, то будь оно проклято, сидеть месяцами и ломать голову из за маленького веса проги, да пусть оно хоть 3 мб. весит лишбы выполняло свою работу. Просто в написании кода на любом языке используйте правильно переменные и упрошайте сводя программу к минимум строк.

На счёт больших весов, встречал программы которые вырезают из ехе - шников, лишние куски (резервные копии исходников, неиспользуемые Dll ки и прочий мусор который раздувает программу.)
Как называются не помню.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 18:45     Как создают маленькие приложения? (размером до ~50-70Кб) #27
Цитата Сообщение от quadrathell Посмотреть сообщение
Просто в написании кода на любом языке используйте правильно переменные и упрошайте сводя программу к минимум строк.
код программы должен быть написан ДЛЯ людей, а на зажимать килобайты исходников с вашим "минимум строк"
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
23.08.2012, 18:57     Как создают маленькие приложения? (размером до ~50-70Кб) #28
Цитата Сообщение от Jupiter Посмотреть сообщение
код программы должен быть написан ДЛЯ людей, а на зажимать килобайты исходников с вашим "минимум строк"
Начнём с того что у каждой команды есть приоритет в скорости её работы, а так же объём в памяти и обработке компилятором.
Для того чтобы код был написан для людей, пишите комментарии к строкам, это пригодится вам и тем кому попадёт исходник.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
23.08.2012, 19:55     Как создают маленькие приложения? (размером до ~50-70Кб) #29
quadrathell, Это не правильно. Код должен быть самодокументирован и без комментариев в очевидных местах + должен быть легко читаем.
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
23.08.2012, 20:44     Как создают маленькие приложения? (размером до ~50-70Кб) #30
Цитата Сообщение от quadrathell Посмотреть сообщение
а так же объём в памяти
Когда есть приоритеты по объёму в памяти (если вдруг такое и вправду бывает), то речь идёт никак не о том, чтобы полмега сэкономить на том, что программа из простой и понятной превращается в геморройную и трудновкуриваемую
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
23.08.2012, 20:56     Как создают маленькие приложения? (размером до ~50-70Кб) #31
Цитата Сообщение от ForEveR Посмотреть сообщение
quadrathell, Это не правильно. Код должен быть самодокументирован и без комментариев в очевидных местах + должен быть легко читаем.
Вы меня прямо в тупик загоняете, на самом деле любой код читаем... иначе бы он просто не работал...
Покажи мне пример не читаемого кода, тогда я возможно пойму о чём речь идёт.

Я иногда к созданию своих программ подхожу не стандартным способом и порой приходится для себя же писать мануал, так как событий много и обработка разных потоков одной процедурой требует правил...

Без дополнительной мной написанной документации, не представляю как написать код для всех читаемым. При всём этом я экономлю на куче дополнительных циклов и создании новых процедур для каждого события.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
23.08.2012, 22:10     Как создают маленькие приложения? (размером до ~50-70Кб) #32
Цитата Сообщение от quadrathell Посмотреть сообщение
Вы меня прямо в тупик загоняете, на самом деле любой код читаем... иначе бы он просто не работал...
Покажи мне пример не читаемого кода, тогда я возможно пойму о чём речь идёт.

C
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
                                       /*
                                      +
                                     +
                                    +
                                    +
                                    [         >i>n[t
                                     */   #include<stdio.h>
                        /*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1;
                     */int/**/main(int/**/n,char**m){FILE*p,*q;int        A,k,a,r,i/*
                   #uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%"   "d\n%d\40%d"/**/
                 "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
          "/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
       "yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
      "*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/**
     */"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2"
     ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[
     i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1]  !='\0'))?fopen(m[1],y+298):stdin;
      /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m]    =<2<5<64;}-]-(m+;yry[rm*])/[*
       */q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{     }[*/:fopen(m[2],d+14);if(!p||/*
       "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++"  <)<      ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/)
    return+printf("Can "  "not\x20open\40%s\40"    ""       "for\40%sing\n",m[!p?1:2],!p?/*
  o=82]5<<+(+3+1+&.(+  m  +-+1.)<)<|<|.6>4>-+(>    m-        &-1.9-2-)-|-|.28>-w-?-m.:>([28+
 */"read":"writ");for  (   a=k=u= 0;y[u];  u=2    +u){y[k++   ]=y[u];}if((a=fread(b,1,1024/*
,mY/R*Y"R*/,p/*U*/)/*          R*/ )>/*U{  */   2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\}
*/sscanf(b,d,&k,& A,&           i,  &r)&&        !   (k-6&&k -5)&&r==255){u=A;if(n>3){/*
]&<1<6<?<m.-+1>3> +:+ .1>3+++     .   -m-)      -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/
u++;i++;}fprintf   (q,    d,k,           u      >>1,i>>1,r);u  = k-5?8:4;k=3;}else
  /*]>*/{(u)=/*{   p> >u  >t>-]s                >++(.yryr*/+(    n+14>17)?8/4:8*5/
     4;}for(r=i=0  ;  ;){u*=6;u+=                (n>3?1:0);if    (y[u]&01)fputc(/*
      <g-e<t.c>h.a r  -(-).)8+<1.                 >;+i.(<)<     <)+{+i.f>([180*/1*
      (r),q);if(y[u   ]&16)k=A;if                               (y[u]&2)k--;if(i/*
      ("^w^NAMORI; {   I*/==a/*"                               )*/){/**/i=a=(u)*11
       &255;if(1&&0>=     (a=                                 fread(b,1,1024,p))&&
        ")]i>(w)-;} {                                         /i-f-(-m--M1-0.)<{"
         [ 8]==59/* */                                       )break;i=0;}r=b[i++]
            ;u+=(/**>>                                     *..</<<<)<[[;]**/+8&*
            (y+u))?(10-              r?4:2):(y[u]         &4)?(k?2:4):2;u=y[u/*
             49;7i\(w)/;}             y}ru\=*ri[        ,mc]o;n}trientuu ren (
             */]-(int)'`';}             fclose(          p);k= +fclose( q);
              /*] <*.na/m*o{ri{                       d;^w^;}  }^_^}}
               "   */   return  k-                -1+   /*\'   '-`*/
                     (   -/*}/   */0x01        );       {;{    }}
                            ;           /*^w^*/        ;}
вот ещё прикольно
C
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
48
49
50
51
52
53
54
55
56
57
58
59
60
d b,x,h;o q[9802],f[9802];void w(d i){fflush(stdout);printf(
"%c"  ,   (  i>b)?(i%b>0?q[i-b-1]:10):5*(b==i?2:9));if(i<x+b
-      1     )w(i+1) ; } d p(o*e,d i ) { e +=i;n h = ( - b-1
)         [                 e ] %         2 + ( -          b
)  [ e  ] %     2                                          +
(-b+1)[ e            ]  % 2         +(       -     1  ) [  e
]  %  2+  e  [1   ]% 2 +b [  e   -  1]% 2  +    b[ e ]% 2  +
b     [      e+1 ]     %2      ;}d m (  d      i     ){    n
(  i  == x -       1      )      ?0     :(  f    [      i  +
1  ]=m                 (i +       1) ) ,32           +3 /  (
(    p( q  ,   i  )>  3      ||    h <  2       )?  7      :
( ( h                   ==        2 &&q[ i ]          ==  32
      )?    8 :             1 )     );}d                   y
(       d                          i ){ d   j , s , t ,a  ,u
;if (     x - 1== i ) n 1 ;if ( f            [i]==2)       {
f [i ]     <<=4;if(y( i))n 1;f[i           ]-=- 3 ; if     (
y(i )       )n 1;n  0 ; };if((i % b              )     ==   
             0 ||(       i % b          )   ==            b-
1         )               n        y (i+1           )     ;j
=    -1 ; l           :           ;    j   =j     + 1 ;     
if   (  j    >=    (  i  -      i   /  b +        2         
   == b          ? 1 :   i       >     2       * b ?i%   b!=
    1    ?2       :    2          *   1<<     1 :8 ))   goto
c;     u       =   p(  f,   i  ) ; if  (        i          <
x  - 2*b - 1   )  { a =( s       =((  t=i       %   b==     
       1)           ?    1      :    i % b          !=     b
   - 2     )   )      &&     i   <            2 * b;u+=    (
a                ? (                                j& 4   )
>>    2 : 0 ) +  (t  ?    ( j & 2 ) / 2 : 0)  +            (
s? (   j&1):0);}else a =t=s=0;if((u&2)+(u&4)!=          2 &&
(q[   i]& 2 ) ==2||u==2&& (f[i]+q[i]) % 2   ==1          ||u
== 3            && ( q [   i]&2)== 0                    )   
                             goto             l      ;     b
[i        +   f          ]     ^=       !          t ?     0
 :   b[ i +       f ]  ^ (         10 + (      j &      2  )
/    2  )     * 3+2;b[ i    + f    +  1    -    b  ]  ^=   !
a  ?0 :           b  [i  +  f    +1 -          b]^   (10+  (
j   &    4)          /            4    )*  3   +2 ;    b [ i
+f     +       1  ]  ^= ! s   ?0     :       b  [i+ f  +   1
]  ^ (10 + (   j  &1)            ) *3+ 2 ;      if  ( y (  i
+      1)           ){ n  1  ;       };          (  a      ?
i  + 1     :     0 )             [ f     ]            =(   t
?                    i+                           b       :0
)       [ f                 ] =       (     s ?           i 
   + b +1:0) [ f ] =     2 ;goto l ;       c:n 0 ; }       d
  main(d c,o**v){d i; x=b=0;while((q[x++]=getchar()   )   !=
  EOF ){x-=(q[x-1]==10)? b+=1,1:0;q[x-1]^= (q[x-1]        ==
32)? 0  :  q [   x  -        1 ] ^ 35  ; } ; w (   0      );
for                           (                        ;   ;
)       {         z    ( f            ,         2 ,  x *    
     k  (  o       )  )  ;   for   (  i  =    0;i<=x -    1;
i  = i +   b  )q [   i /    b]   = q [   x      -  b+  i  /b
]   =    q       [ i  ]=  q       [    i           -       (
(i   ==  0)           ?            0:  1)       ]  =f [ i  /
b   ] = f[ x      -b -1+ i/  b]   = f [i ]      =f[         
      i    -          (             (    i        == 0  )  ?
0       :1        ) ]  =        32;   if       ( c        ==
1           ) m (         0                        );   else
if          (y (     b                      +             1)
==0)n 1;f[0]<<=1<<2;memcpy(q,f,x*k(o));w(0);sleep(1);};n 0;}


Источник: http://www.ioccc.org/
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
23.08.2012, 22:36     Как создают маленькие приложения? (размером до ~50-70Кб) #33
это не код а данные, полагаю после их обработки можно получить картинку...
Это тут причём?
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
23.08.2012, 23:11     Как создают маленькие приложения? (размером до ~50-70Кб) #34
Цитата Сообщение от quadrathell Посмотреть сообщение
это не код а данные, полагаю после их обработки можно получить картинку...
Это тут причём?
Это программа на С, присмотритесь. Просто нечитаемая.
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
24.08.2012, 00:37     Как создают маленькие приложения? (размером до ~50-70Кб) #35
С си не знаком, но думаю, тот кто прогает на нём прочитают.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.08.2012, 12:43     Как создают маленькие приложения? (размером до ~50-70Кб) #36
Цитата Сообщение от quadrathell Посмотреть сообщение
Для того чтобы код был написан для людей, пишите комментарии к строкам, это пригодится вам и тем кому попадёт исходник.
комментарии к коду ещё не свидетельствуют о его корректности
программа должна быть понятной человеку, чтобы тот мог легко убедиться в её правильности

Цитата Сообщение от quadrathell Посмотреть сообщение
Вы меня прямо в тупик загоняете, на самом деле любой код читаем... иначе бы он просто не работал...
код может работать, но неправильно (это называется "логической ошибкой")
quadrathell
1 / 1 / 0
Регистрация: 24.10.2009
Сообщений: 22
25.08.2012, 14:22     Как создают маленькие приложения? (размером до ~50-70Кб) #37
Когда то один мой знакомый писал программы весом 50-70 кб. Разной сложности...
Начиная от программаторов с прошивками чипов и заканчивая другими более сложными для предприятий... (бухгалтерия и прочие фишки связанные с локалкой и интернет)
Я поинтересовался как он этого добился... Ответ был прост ... - Я писал на ассемблере.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
25.08.2012, 14:28     Как создают маленькие приложения? (размером до ~50-70Кб) #38
Цитата Сообщение от quadrathell Посмотреть сообщение
Я писал на ассемблере.
Слинкуй с ассемблерной прогой VCL, получишь такой же размер, как на любом языке программирования - несколько сотен килобайт.

Добавлено через 56 секунд
Цитата Сообщение от quadrathell Посмотреть сообщение
Вы меня прямо в тупик загоняете, на самом деле любой код читаем... иначе бы он просто не работал...
Эх, наивность...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 22:19     Как создают маленькие приложения? (размером до ~50-70Кб)
Еще ссылки по теме:

Определить взаимное расположение трех точек на плоскости (совпадают, на одной прямой, создают треугольник) C++
C++ Builder Из матрицы размером n получить матрицу размером n-1 путем удаления строки и столбца на пересечении max элемент
C++ WinAPI Создать окно приложения размером в одну шестнадцатую площади экрана с заголовком
Как получить большие и маленькие символы C++
Как убрать из одного числа другие маленькие числа? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VTsaregorodtsev
315 / 295 / 41
Регистрация: 19.02.2010
Сообщений: 1,270
25.08.2012, 22:19     Как создают маленькие приложения? (размером до ~50-70Кб) #39
Цитата Сообщение от ExeiLj Посмотреть сообщение
Так может кто скажет, как настроить Embarcadero RAD Studio, чтобы компилить малые проги (пусть даже только с WinAPI)?
Когда я копилю пустую прогу в VCL Form Application, то получается 300+ кб, в Консоли 7кб. А я читал, что прога (пустая) может весить 1кб! Как этого добиться?
Сделать самому коротенькие стартап-файлы (асм, скомпилированный в объектник), которые будут вызывать либо WinMain, либо DllMain. И ручками подправить файл проекта (или make-файл - от среды разработки зависит) - убрать упоминание стандартной либы и взамен её подключить свой стартап-объектник.

Вот, например, пример асм-кода (старый, может не компиляться современными ассемблерами - нужно будет подправить) такого стартапа для обычного екзешника (для делания дллок будет другой, вызывающий DllMain):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.586
.model  flat,stdcall
 
TASM    equ 1
UNICODE equ 0
 
include w32.inc
 
.data?
_hInstance  dd  ?
lpszCmdLine dd  ?
 
.code
start:
;call    InitCommonControls
 call    GetModuleHandle,NULL
 mov     _hInstance,eax
 call    GetCommandLine
 mov     lpszCmdLine,eax
 call   WinMain,_hInstance,NULL,lpszCmdLine,NULL
 call    ExitProcess,NULL
end     start
Видно, что никаких лишних функций не вызывается (а вот стартап из идущей с компилятором библиотеки мог цеплять что-то добавочное - лишнее).
Но в своей проге придётся пользоваться только ВинАПИ - и нельзя будет пользоваться функциями из библиотек компилятора. Потому, что тогда среда разработки будет линковать библиотечный файл, где лежит стандартный стартап-код - и возникнет конфликт (вариант решения - скопировать нужные стандартны библиотечные функции в отдельную либу и ручками прицепить её к проекту). Также стандартные функции могли использовать какие-то переменные, которые мы новым стартап-кодом не инициализировали. Поэтому - при выходе за рамки чистого С (или С++ без классов) и за рамки ВинАПИ возникают проблемы, не всегда решаемые (ну так за изврат с уменьшением размера екзешника надо чем-то платить).
Yandex
Объявления
25.08.2012, 22:19     Как создают маленькие приложения? (размером до ~50-70Кб)
Ответ Создать тему
Опции темы

Текущее время: 09:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru