Dynamic Libraries


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

  1. A DLL is more difficult to use because the main program will require the respective DLLs in the target computer.
  2. It is possible to use a different version of a DLL without recompiling the program
  3. The main advantage of using DLLs is that they are loaded only once in memory so that they can be used for several programs (saving memory)

  1. La DLL es más difícil de usar porque requiere que el programa ejecutable sea instalado con las respectivas DLL's.
  2. Es posible usar diferentes versiones de la DLL sin recompilar el programa.
  3. La ventaja de usar DLL's es que se cargan una sola vez en memoria para que puedan ser usadas por varios programas (ahorrando memoria)

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.

CreateDLL

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.

ExportSymbolsDLL

Step B
Add a DEF file Project > Add New Item ... as shown below.
Agregue un archivo DEFProject > Add New Item ... como se muestra debajo.

DefFile

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.

MyPowerRelease

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.

UsingPowerGui

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.

MyPowerCopy

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.

CopyDLL

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);
}

UsingPowerRun

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.

PoorPowerGui

PoorPowerDebugFolder

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);
}

PoorPowerRun

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"))();
}

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home