Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
highlevel:c:advancing [2008/05/28 09:41] alfred |
highlevel:c:advancing [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 227: | Línea 227: | ||
| </code> | </code> | ||
| + | |||
| Línea 241: | Línea 242: | ||
| Una cosa a tener en cuenta es que no deben ser añadidos a colecciones, al menos los de la STL, su funcionamiento no sería correcto. | Una cosa a tener en cuenta es que no deben ser añadidos a colecciones, al menos los de la STL, su funcionamiento no sería correcto. | ||
| - | ===== Otros ===== | + | |
| + | ===== Bibliotecas (Libraries) ===== | ||
| + | Una biblioteca es una colección de código que permite hacer dicho código independiente del programa en el que se añaden, esto hace que el código pueda ser estructurado y reutilzado de forma modular. Existen dos tipos de bibliotecas: | ||
| + | * Estáticas, se añaden al programa, en el mismo archivo, en tiempo de compilación. | ||
| + | * Dinámicas, se cargan y se enlazan al programa en el momento en el que este lo necesita, durante el tiempo de ejecución. En sistemas Windows son llamadas DLL y pueden tener como extensión .dll, .ocx (si incluyen un control ActiveX) o .drv (si pertenecen a un driver). | ||
| + | [[code:tools#tips_creando_bibliotecas|Tips para crear bibliotecas desde Visual Studio]] | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Crear y utilizar una biblioteca (Windows) ==== | ||
| + | Compilar una biblioteca estática no tiene problema alguno, se hace como si de un ejecutable normal se tratase sólo que el resultado es un archivo .lib, este ha de vincularse al proyecto y será si el código fuente estubiese en él. Debes hacer un ''#include'' de los .h correspondientes, pero estos no han de tener nada especial, simplemente han de ser copiados ahí. \\ | ||
| + | En cambio, cuando se va a utilizar una librería dinámica en un programa es necesario que se proporcionen dos archivos, un .h (mediante un #include) y un .lib (esta debe ser vinculada desde el compilador), en el primero estará el código de dicha biblioteca y en el segundo un mapeo al archivo .dll. \\ | ||
| + | Al crear la librería hay que tener en cuenta las siguientes cosas: | ||
| + | * En el archivo .h del código correspondiente a la biblioteca añadiremos ''<nowiki>extern "C" _declspec(dllexport)</nowiki>'' antes de cada función que queramos que sea utilizable en la biblioteca. | ||
| + | * El archivo .h que se añadirá al código del programa debe de contener ''<nowiki>extern "C" _declspec(dllimport)</nowiki>'' delante de cada declaración de función. | ||
| + | <code> | ||
| + | /*************** Proyecto Librería **********************/ | ||
| + | // lib.h | ||
| + | extern "C" _declspec(dllexport) int suma (int); | ||
| + | |||
| + | // lib.cpp | ||
| + | #include "lib.h" | ||
| + | int suma (int a) { | ||
| + | return a + 4; | ||
| + | } | ||
| + | |||
| + | /*************** Proyecto Ejecutable **********************/ | ||
| + | // bin.h | ||
| + | extern "C" _declspec(dllimport) int suma (int); | ||
| + | |||
| + | // bin.cpp | ||
| + | #include <iostream> | ||
| + | #include <stdlib.h> | ||
| + | #include "lib.h" | ||
| + | |||
| + | void main () { | ||
| + | std::cout << suma(33) << std::endl; | ||
| + | system("pause"); | ||
| + | } | ||
| + | </code> | ||
| + | * La parte del **''<nowiki>extern "C"</nowiki>''** no es necesaria en algunos compiladores. | ||
| + | * Respecto a importar\exportar clases la sintaxis es: ''<nowiki>class _declspec(dllimport) nombreClase</nowiki>''. En la cabecera del ejecutable no sería necesario añadir los privates. | ||
| + | <code cpp> | ||
| + | /*************** Proyecto Librería **********************/ | ||
| + | // lib.h | ||
| + | class _declspec(dllimport) A { | ||
| + | private: | ||
| + | int suma (int i); | ||
| + | public: | ||
| + | int haz (int i); | ||
| + | }; | ||
| + | |||
| + | /*************** Proyecto Ejecutable **********************/ | ||
| + | // bin.h | ||
| + | // lib.h | ||
| + | class _declspec(dllimport) A { | ||
| + | public: | ||
| + | int haz (int i); | ||
| + | }; | ||
| + | </code> | ||
| + | * Para definir las funciones a exportar en una dll podemos utilizar también un fichero .def. | ||
| + | |||
| + | === DllMain === | ||
| + | Una dll al iniciarse llama a una función "main" de esta, nosotros podemos escribirla si seguimos la siguiente sintaxis: ''BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)''. | ||
| + | <code cpp> | ||
| + | ... | ||
| + | BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { | ||
| + | std::cout << "Dll inicializada" << std::endl; | ||
| + | return TRUE; | ||
| + | } | ||
| + | ... | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ===== [More] Effective C++ ===== | ||
| + | * [[highlevel:c:effective|[More] Effective C++]] | ||