Dynamic Library |
It is a library dynamically linked. It has functions and classes ready to be used. In order to use the functions (and classes) inside the dynamic library, it is necessary to have a header file (*.h), and a static library (*.lib) file at the moment of the compilation. Additionally, it is necessary to have a dynamic library file (*.dll) during the execution of the program that uses the DLL. Usually, the *.lib file is very small. To create a DLL, the new Win 32 project wizard is used with the option Export Symbols. Es una librería enlazada dinámicamente. Contiene funciones y clases listas para ser usadas. Para usar las funciones (y clases) contenidas en una librería dinámica se debe tener un archivo de encabezado (*.h), un archivo de librería estática (*.lib) en el momento de compilación. Adicionalmente, se requiere un archivo de librería enlazada dinámicamente (*.dll) en el momento de la ejecución del programa que usa la DLL. Usualmente el archivo *.lib es de tamaño muy pequeño. Para crear una DLL se usa un proyecto de Win32 de librería dinámica con la opción de Export Symbols. |
Tip |
In some cases, the creator of the DLL does not provide the header file (*.h) neither the static library file (*.lib). In these cases, the header file must be created manually. En algunos casos el creador de la DLL no proporciona el archivo de encabezado (*.h) ni tampoco el archivo de librería estática (*.lib). En estos casos, el archivo de encabezado debe crearse manualmente. |
LIB vs DLL |
|
Tip |
Create a DLL only when you know that two o more program will use the DLL at the same time. Cree una DLL solamente cuando usted conozca que dos o más programas usaran la DLL al mismo tiempo. |
Tip |
Always place a DLL in the same folder where the executable is. Do not place your DLLs in the Windows folder. Siempre coloque una DLL en la misma carpeta dónde esta el ejecutable. No coloque sus DLLS in la carpeta de Windows. |
Problem 1 |
Create a DLL called MyPower: New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard. If you do not find the Windows Desktop Wizard, you may use Windows Desktop Application, and during the Wizard, select Dynamic Link Library. Cree una DLL llamada MyPower: New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard. Si usted no encuentra Windows Desktop Wizard, usted puede usar Windows Desktop Application, y durante el asistente, seleccione Librería de Enlace Dinámica. |
Step A |
Press the Next Button and click on Application Settings. Then check the options as shown. Finally, press the Finish button. Presione el botón de siguiente y haga clic en Application Settings. Entonces marque las opciones como se muestra. Finalmente, presiona el botón de Finish. |
Step B |
Add a DEF file Project > Add New Item ... as shown below. Agregue un archivo DEFProject > Add New Item ... como se muestra debajo. |
Step C |
Edit the files: MyPower.def, MyPower.cpp and MyPower.def as shown below. Edite los archivos: MyPower.def, MyPower.cpp and MyPower.def como se muestra debajo. |
MyPower.def |
LIBRARY "MyPower" EXPORTS Duplicate |
MyPower.h |
#ifdef MYPOWER_EXPORTS #define MYPOWER_API __declspec(dllexport) #else #define MYPOWER_API __declspec(dllimport) #endif MYPOWER_API int Duplicate(int x); |
MyPower.cpp |
// MyPower.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include "MyPower.h" MYPOWER_API int Duplicate(int x) { return 2*x; } |
Step D |
Change the configuration to Release and build the project. On the Release folder of the project you will find the files: MyPower.lib and MyPower.dll. Cambie la configuración al modo Release y construya el proyecto. En la carpeta de Release usted encontrará los archivos: MyPower.lib y MyPower.dll. |
Tip |
Good programmers create a Debug version of the DLL and a Release version of the library. In the previous problems: MyPowerD.dll (Debug) and MyPower.dll (Release). Do not forget to provide the files MyPower.h and MyPower.lib to your clients. Los buenos programadores crean una version de Debug y una version de Release de la libreria. En el problema previo: MyPowerD.dll (Debug) y MyPower.dll (Release). No se olvide de proporcionar a sus clientes los archivos MyPower.h y MyPower.lib. |
Problem 2 |
Create a Wintempla dialog application called UsingPower to call the function inside the MyPower.dll file. Cree una aplicación Wintempla de dialogo llamada UsingPower para llamar la función dentro del archivo MyPower.dll. |
Step A |
Copy the files: MyPower.h, and MyPower.lib from the previous project folder to this project folder as shown. Copie los archivos: MyPower.h, and MyPower.lib desde la carpeta del proyecto previo a la carpeta de este proyecto como se muestra. |
Step B |
Copy the file: MyPower.dll from the previous project folder to the Debug folder of this project as shown. Observe that the Debug folder is created until you build the project for the first time, thus, the Debug folder may no exists. Copie el archivo: MyPower.dll desde la carpeta del proyecto previo a la carpeta de Debug de este proyecto como se muestra. Observe que la carpeta de Debug se crea hasta que usted construye el proyecto por primera vez, así, la carpeta de Debug puede no existir. |
Step C |
Edit the UsingPower.h and UsingPower.cpp files as shown. Edite los archivos: UsingPower.h and UsingPower.cpp como se muestra. |
UsingPower.h |
#pragma once //______________________________________ UsingPower.h #include "Resource.h" #include "MyPower.h" #pragma comment(lib, "MyPower.lib") class UsingPower: public Win::Dialog { public: UsingPower() { } ~UsingPower() { } protected: ... }; |
UsingPower.cpp |
#include "stdafx.h" //________________________________________ UsingPower.cpp #include "UsingPower.h" int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE , LPTSTR cmdLine, int cmdShow){ UsingPower app; return app.BeginDialog(IDI_UsingPower, hInstance); } void UsingPower::Window_Open(Win::Event& e) { } void UsingPower::btDuplicate_Click(Win::Event& e) { const int x = tbxInput.IntValue; tbxOutput.IntValue = Duplicate(x); } |
Problem 3 |
Suppose the creator of the MyPower.dll is not providing the files: MyPower.h nor MyPower.lib. Create a Wintempla dialog application called PoorPower. Suponga que el creador de la librería MyPower.dll no está proporcionando los archivos: MyPower.h ni MyPower.lib. Cree un aplicación Wintempla de dialogo llamada PoorPower. |
Step A |
Edit the GUI and build your project. Then copy the MyPower.dll file to the Debug folder as shown. Edite la GUI y construya su proyecto. Entonces copie el archivo MyPower.dll a la carpeta de Debug como se muestra. |
Step B |
Edit the PoorPower.h and PoorPower.cpp files as shown. Edite los archivos PoorPower.h and PoorPower.cpp como se muestra. |
PoorPower.h |
#pragma once //______________________________________ PoorPower.h #include "Resource.h" //typedef int (*DUPLICATE)(int); class PoorPower: public Win::Dialog { public: PoorPower() { hDLL = ::LoadLibrary(L"MyPower.dll"); if (hDLL == NULL) { this->MessageBox(L"The MyPower.dll file could not be found", L"PoorPower", MB_OK | MB_ICONERROR); } } ~PoorPower() { ::FreeLibrary(hDLL); } int Duplicate(int x); HINSTANCE hDLL; ... }; |
PoorPower.cpp |
#include "stdafx.h" //________________________________________ PoorPower.cpp #include "PoorPower.h" int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE , LPTSTR cmdLine, int cmdShow){ PoorPower app; return app.BeginDialog(IDI_POORPOWER, hInstance); } void PoorPower::Window_Open(Win::Event& e) { } void PoorPower::btDuplicate_Click(Win::Event& e) { const int x = tbxInput.IntValue; tbxOutput.IntValue = Duplicate(x); } int PoorPower::Duplicate(int x) { //DUPLICATE d = (DUPLICATE)::GetProcAddress(hDLL,"Duplicate"); //return d(x); return ( (int(*)(int))::GetProcAddress(hDLL, "Duplicate"))(x); } |
Tip |
To simplify the use of DLLs you may use the class Sys::DLLibrary include in Wintempla. Para simplificar el uso de las DLLs usted puede usar la clase Sys::DLLibrary incluida en Wintempla. |
Tip |
Examples of DLL without LIB: Ejemplos de DLL sin LIB: |
Program.cpp |
double Power::Analyze(int x) { return ( (double(*)(int))::GetProcAddress(hDLL, "Analyze"))(x); } double Power::Tax(bool detail) { return ( (double(*)(bool ))::GetProcAddress(hDLL, "Tax"))(detail); } int Power::GetVersion() { return ( (int(*)())::GetProcAddress(hDLL, "GetVersion"))(); } |