Pequeño programa creado con Builder C++.Este artículo describe el modo de crear ejecutables de pequeño tamaño bajo windows-32bits cuando solo se van a usar las funciones del API. Un programa de Builder C++ sin ventanas ocupa 150 Kb o más, sin embargo el programa del ejemplo tiene un tamaño de solo 4 Kb. Un programa creado con Builder C++ tiene normalmente un tamaño mayor de 150 Kb, incluso si se elimina toda referencia a la librería VCL y solo se usan funciones del API. En principio podemos pensar que usando solo funciones del API un programa no debería tener este tamaño, sin embargo Builder C++ incluye en cada programa el módulo de arranque C0W32.OBJ. Este módulo lleva a cabo varias inicializaciones en las librerías del Builder y provoca que estas partes de las librerías se incluyan en el ejecutable, aunque luego el programa no haga uso de ellas. Para generar un ejecutable con un tamaño mínimo será necesario eliminar en la compilacion el módulo de arrranque normal y sustituirlo por otro creado al efecto. Hay que tener en cuenta que el uso de algunas porciones de las librerías de borland pueden provocar errores debidos a la falta de inicializacion. El ejemplo que se muestra a continuacion consta de un fichero de inicializacion (BINIT.ASM) y un fichero fuente (MINI.CPP) que contiene una llamada al API (MessageBox). Se incluye tambien un Makefile para compilar el ejemplo (Solo hay que ejecutar MAKE.EXE para generar el programa), el programa solo usa la librería de importacion IMPORT32.LIB. BINIT.ASM; arranque del programa-minimo (Borland-Builder)
.386
Locals
jumps
.model flat, stdcall
extrn ExitProcess : PROC
extrn WinMain : PROC
.data
.code
Main:
xor eax, eax
push eax
push eax
push eax
push eax
call WinMain
push eax
call ExitProcess
End Main
MINI.CPP//-----------------------------
#include <windows.h>
#pragma hdrstop
//--------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
MessageBox(NULL, "Probando ...", "MiniApp", MB_ICONINFORMATION);
return 0;
}
MAKEFILE# ---------------------------------------------------- # MINI.EXE # ---------------------------------------------------- !if !$d(BCB) BCB = $(MAKEDIR)\.. !endif CFLAGS = -c -O2 -I$(BCB)\include AFLAGS = /mx /m3 LFLAGS = -c -n -aa -Tpe -L$(BCB)\lib OBJS = mini.obj binit.obj LIBS = import32.lib All: bcc32 $(CFLAGS) mini.cpp tasm32 $(AFLAGS) binit.asm tlink32 $(LFLAGS) $(OBJS),mini.exe,,$(LIBS) Puedes descargar un ejemplo un poco más completo que crea una ventana con barras de scroll y tambien inicializa los parámetros de WinMain a sus valores reales. |