{"id":365,"date":"2026-03-06T22:46:07","date_gmt":"2026-03-06T22:46:07","guid":{"rendered":"https:\/\/hackcuba.net\/?p=365"},"modified":"2026-03-06T22:51:56","modified_gmt":"2026-03-06T22:51:56","slug":"paquetes-de-c-builder","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=365","title":{"rendered":"Paquetes de C++ Builder"},"content":{"rendered":"\n<p>Los paquetes son archivos que contienen datos binarios y recursos, listos para ser usados por una aplicaci\u00f3n cliente, igual que las DLLs y los ensamblados de .NET. \u00c9stos son incluso cargados y linkeados tanto din\u00e1mica c\u00f3mo est\u00e1ticamente. Ustedes se preguntar\u00e1n: \u00bfentonces cu\u00e1l es la diferencia entre una DLL y un paquete?<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Para empezar, las DLLs se cargan con la funci\u00f3n del API de Windows <code>LoadLibrary<\/code>; los <em>inits<\/em> son ejecutados por orden de prioridad y por orden de linkeo. Los datos y funciones de las DLLs se importan usando <code>__declspec(dllimport)<\/code> (muy pocas veces usado) o <code>__import<\/code>, y se exportan con <code>__export<\/code>.<br>Los paquetes, por su parte, se cargan con <code>LoadPackage<\/code> y los <em>inits<\/em> procesados, al rev\u00e9s del orden de dependencia de <em>units<\/em>, por orden de linkeo y por el de prioridad. Las funciones y los datos de los paquetes son exportados e importados usando <code>__declspec(package)<\/code>.<\/p>\n\n\n\n<p>Bueno, \u00e9stas son leves diferencias t\u00e9cnicas inherentes al uso de nuevas tecnolog\u00edas, considerando principalmente que los paquetes BPL son propios del C++ Builder. Pero la principal diferencia entre los paquetes y las DLLs radica a la hora de linkear din\u00e1micamente los BPI:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Las entradas <em>inits<\/em> no son copiadas dentro de una tabla <em>init<\/em> como en las DLLs, sino en un <code>__PackageInfoTable<\/code> que la funci\u00f3n <code>LoadPackage()<\/code> sabe leer.<\/li>\n\n\n\n<li>Al final de los BPL se agregan recursos adicionales.<\/li>\n\n\n\n<li>El c\u00f3digo de inicio no est\u00e1 en <em>c0pkg32.obj<\/em>, sino en <em>c0d32.obj<\/em>. <em>c0pkg32.obj<\/em> no puede llamar a ninguna <em>init<\/em> de ninguna <em>unit<\/em> (porque no procesa <code>__PackageInfoTable<\/code>), pero s\u00ed los procesa para un <em>.obj<\/em>, donde los <em>inits<\/em> de los paquetes son copiados en el mismo lugar que en una DLL y se comportar\u00e1 como est\u00e9 en el resto de los aspectos. M\u00e1s bien, un <em>.bpl<\/em> sin estar compuesto de ning\u00fan <em>unit<\/em> se comportar\u00e1 como una DLL com\u00fan.<\/li>\n<\/ul>\n\n\n\n<p>En pocas palabras: Un <em>.bpl<\/em> que sea din\u00e1micamente cargado tendr\u00e1 todas sus <em>units<\/em> inicializadas por <code>LoadPackage<\/code> en el orden mencionado. Cuando \u00e9ste se carga est\u00e1ticamente (usando los <em>.bpi<\/em>) s\u00f3lo tendr\u00e1 esos <em>units<\/em> que hayan sidos inicializados por el c\u00f3digo del ejecutable que lo utilice, en el orden descrito anteriormente, aunque sea parcial.<\/p>\n\n\n\n<p>Esta inicializaci\u00f3n parcial tiene sus ventajas de velocidad, sobre todo <em>vcl60.bpi<\/em> (paquete que contiene funciones de la VCL) es bastante larga y no todo el mundo necesita usar todas estas <em>units<\/em> que residen en un ActiveX, un COM, etc. Si se analiza la inicializaci\u00f3n parcial, s\u00f3lo ocurrir\u00e1 donde sean usado los <em>units<\/em>; los <em>.obj<\/em> regularmente son inicializados como las DLLs, donde ninguna parcialidad es permitida.<\/p>\n\n\n\n<p>En resumen, un paquete es como una DLL que b\u00e1sicamente contiene <em>units<\/em> que permite la inicializaci\u00f3n parcial cuando est\u00e1 linkeado est\u00e1ticamente a un <em>.exe<\/em>; tambi\u00e9n usado para permitirle al IDE agregar un componente visual a la paleta, mediante un tipo de programaci\u00f3n especifica (de componentes visuales del Borland).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paquetes com\u00fanmente usados::<\/h2>\n\n\n\n<p>Si usted programa en C++ Builder sabr\u00e1 lo que es la VCL del Builder, y las facilidades que \u00e9sta permite -a diferencia del Visual C++ de la Microsoft- para desarrollar aplicaciones visuales creando los formularios y agregando componentes y controles visuales en tiempo de ejecuci\u00f3n. Estas funciones y controles visuales de la VCL est\u00e1n contenidos en paquetes, lo cual se puede chequear. Por ejemplo, seleccione con la vista una p\u00e1gina de la paleta de componentes visuales y observe los controles que posee. Ahora vaya a <em>Component<\/em> \u00bb <em>Configure Palette&#8230;<\/em> y ver\u00e1 como aparecer\u00e1n las paletas con sus controles y, al lado de los controles que est\u00e1n en <em>Components<\/em>, aparecer\u00e1 el nombre del paquete a que pertenecen. Usted ver\u00e1 algo c\u00f3mo esto:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"444\" height=\"429\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660003.png\" alt=\"\" class=\"wp-image-366\" srcset=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660003.png 444w, https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660003-300x290.png 300w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/figure>\n\n\n\n<p>Note que los controles de la paleta <em>Standard<\/em> pertenecen al paquete <em>dclstd60<\/em>. Eso est\u00e1 muy bien, pero \u00bfpudiera agregar alg\u00fan componente visual que yo halla conseguido o creado? Es sencillo: vaya a <em>Components<\/em> \u00bb <em>Install Packages&#8230;<\/em> y ver\u00e1 c\u00f3mo aparece un ventana conteniendo el nombre completo de los controles y debajo la ruta completa de su BPL o paquete respectivo. Si seleccionan en <em>Components<\/em> ver\u00e1n cu\u00e1les son los componentes visuales que contiene y que aparecen disponibles en la paleta de componentes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"424\" height=\"405\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660004.png\" alt=\"\" class=\"wp-image-367\" srcset=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660004.png 424w, https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660004-300x287.png 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><\/figure>\n\n\n\n<p>Para agregar un nuevo componente, deber\u00e1n presionar sobre <em>Add&#8230;<\/em>; luego se les pedir\u00e1 que agreguen un nuevo <em>.bpl<\/em>, y si \u00e9ste es visual aparecer\u00e1 en la paleta de componentes visuales en la p\u00e1gina donde se halla programado el paquete (muchas veces es en <em>Sample<\/em>).<\/p>\n\n\n\n<p>Cuando se va a compilar y linkear un proyecto se debe especificar se debe especificar c\u00f3mo va a usar los paquetes que requiere: din\u00e1mica o est\u00e1ticamente. Por defecto se usa el enlace din\u00e1mico. Es posible tambi\u00e9n escoger <em>units<\/em> que est\u00e9n en otros paquetes para que sean linkeados din\u00e1micamente a una <em>unit<\/em> de un proyecto de determinado. Para hacerlo, tienes que usar <code>#pragma link \"unitname\"<\/code>. Esto hace que a la hora del linkeo incluya el <em>obj<\/em> de la clase requerida del paquete en el archivo <em>.lib<\/em>.<\/p>\n\n\n\n<p>La tabla a continuaci\u00f3n contiene los archivos que com\u00fanmente se crean cada vez que compilamos un ejecutable. Recuerden que los paquetes pueden ser enlazados est\u00e1tica y din\u00e1micamente, adem\u00e1s de que su contenido puede estar formando parte de la aplicaci\u00f3n cliente que lo usa, por lo que el <em>.bpl<\/em> no se crea.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td colspan=\"4\"><strong>Paquetes creados en una compilaci\u00f3n exitosa<\/strong><\/td><\/tr><tr><td>Extensi\u00f3n<\/td><td>Descripci\u00f3n<\/td><td>Tipo<\/td><td>Prop\u00f3sito<\/td><\/tr><tr><td><em>.bpl<\/em><\/td><td>Borland Package Library<\/td><td>Biblioteca enlazable din\u00e1micamente<\/td><td>Contiene c\u00f3digo ejecutable del paquete y exporta las funciones y datos del paquete.<br>Una biblioteca en tiempo de ejecuci\u00f3n accedida por aplicaciones que est\u00e1n din\u00e1micamente linkeada a ella.<br>Una biblioteca en tiempo de dise\u00f1o que puede ser instalada dentro del IDE para hacer nuevos componentes o editores disponibles en tiempo de dise\u00f1o.<\/td><\/tr><tr><td><em>.bpi<\/em><\/td><td>Borland Import Library<\/td><td>Biblioteca de Importaci\u00f3n<\/td><td>Contiene registros de importaci\u00f3n para las funciones y datos exportados por el correspondiente archivo BPL requerido para el enlace din\u00e1mico a el archivo BPL.<\/td><\/tr><tr><td><em>.lib<\/em><\/td><td>Static Library File<\/td><td>Biblioteca de Objetos<\/td><td>Una biblioteca que contiene los archivos <em>object<\/em> de los <em>units<\/em> contenidos por \u00e9l. Usado para linkear din\u00e1micamente datos y funciones a una aplicaci\u00f3n cliente.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Consideraciones para usar Clases empaquetadas::<\/h2>\n\n\n\n<p>Para que una clase sea exportada o importada desde un paquete, se deber\u00e1 usar la macro <code>PACKAGE<\/code> despu\u00e9s de la palabra clave <code>class<\/code> en la definici\u00f3n de la clase:<\/p>\n\n\n\n<p><code>class PACKAGE TMyComponent : public TComponent<br>{<br><\/code>\/\/ Definici\u00f3n de la clase componente <code><br>};<\/code><\/p>\n\n\n\n<p>La macro <code>PACKAGE<\/code> tambi\u00e9n deber\u00e1 ser usada en la funci\u00f3n <code>Register()<\/code> del paquete. Ejemplo:<\/p>\n\n\n\n<p><code>namespace Newcomponent<br>{<br>&nbsp;&nbsp;void __fastcall PACKAGE Register()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;TComponentClass classes[1] = {__classid(TMyComponent)};<br>&nbsp;&nbsp;&nbsp;&nbsp;RegisterComponents(\"Samples\", classes, 0);<br>&nbsp;&nbsp;}<br>}<\/code><\/p>\n\n\n\n<p>Por supuesto, tambi\u00e9n se aplica a las clases componentes y si usas el <em>Wizard<\/em>, Builder lo insertar\u00e1 por ti.<\/p>\n\n\n\n<p>Para garantizar que la clase contenida en un paquete sea manipulada correctamente, la directiva <code>#pragma package(smart_init)<\/code> deber\u00e1 aparece en archivo fuente de la <em>unit<\/em>. El prop\u00f3sito de esto es asegurar que los <em>units<\/em> empaquetados sean inicializados seg\u00fan sus dependencias. La directiva <code>#pragma package(smart_init,weak)<\/code> ser\u00e1 usada cuando no se quiera que una <em>unit<\/em> en particular sea contenida en el archivo BPL; en su lugar ser\u00e1 puesta en el BPI y linkeada est\u00e1ticamente a la aplicaci\u00f3n. Estos tipos de empaques d\u00e9biles se usan para que no halla conflictos entre paquetes que dependan de una misma librer\u00eda externa (o sea, para que los paquetes se puedan comunicar desde app-bpl).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones:<\/h2>\n\n\n\n<p>Los paquetes son una excelente opci\u00f3n para crear componentes visuales, no visuales, clases, procedimientos y recursos. Es posible que tengas funciones que uses y rehuses en uno o m\u00e1s programas que has hecho, por lo que querr\u00e1s desarrollar una biblioteca para compartir todas esas utilidades y tener mejor control y rendimiento de tus programas. Un ejemplo son los juegos que usan las bibliotecas del DirectX, imag\u00ednate si cada juego almacenara las DLLs del Direct3D en su carpeta&#8230; tendr\u00edamos una redundancia de archivos repetidos enorme. Lo que hacemos es instalar la \u00faltima versi\u00f3n del DirectX que contiene las funciones anteriores muchas veces mejoradas y otras nuevas. Es como trabajar con clases para los novatos: cuando te acostumbras no dejas de hacerlo nunca m\u00e1s. Recuerda usar en tus grandes DLLs o paquetes, pero conociendo las ventajas de este \u00faltimo&#8230; bueno, t\u00fa sabr\u00e1s ;).<\/p>\n\n\n\n<p>Alguno de ustedes dir\u00e1n: yo no he visto ning\u00fan programa que contenga paquetes en vez de DLLs. Bueno, por citarte uno muy bueno, instala el TuneUp Utilities 2007 (programa que recomiendo para mantener tu m\u00e1quina estable y bien personalizada), haz clic derecho sobre su acceso directo, ve a <em>Propiedades<\/em> y cuando salga el cuadro de di\u00e1logo, presiona el bot\u00f3n <em>Buscar destino<\/em>; cuando est\u00e9s en la carpeta del programa, ver\u00e1s los paquetes a tutipl\u00e9n, incluso te dar\u00e1s cuenta de que inteligentemente el programa desglosa sus labores en distintos paquetes, para no tener que instalar recursos innecesariamente en caso de que no vayas a utilizar uno espec\u00edfico. Viste, bistec ;).<\/p>\n\n\n\n<p>Recuerda escribirme tus experiencias,<br>saludos,<br>Eliux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Borland C++ Builder Help<\/li>\n\n\n\n<li>Gu\u00eda del C++ Builder 6<\/li>\n<\/ul>\n\n\n\n<p>Escrito por EliuX [<a href=\"mailto:aorozco@infomed.sld.cu\">aorozco@infomed.sld.cu<\/a>]<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los paquetes son archivos que contienen datos binarios y recursos, listos para ser usados por una aplicaci\u00f3n cliente,<\/p>\n","protected":false},"author":2,"featured_media":376,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,36],"tags":[125,38],"class_list":["post-365","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-proyecto-blackhat","tag-c-builder","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions"}],"predecessor-version":[{"id":368,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions\/368"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/376"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}