Copy Link
Add to Bookmark
Report

Gedzac Mitosis Ezine Issue 01 003

eZine's profile picture
Published in 
Mitosis
 · 11 Oct 2020

  

(C) MITOSIS #1 E-Zine/GEDZAC 2002


Tema : Construcción de un applet de panel de control utilizando Delphi (CPL).
Autor : ErGrone
Válido para : Delphi 2 y superiores.

--------------------------------------------------------------------------------------------

¿Que es un CPL?, un cpl es una DLL así de simple, una DLL que el sistema guindous ejecuta como cualquier ejecutable gracias a que en el registro esta extensión esta linkada asi:

rundll32.exe shell32.dll,Control_RunDLL %1,%*

de este modo si a una dll le cambiamos la extensión por .CPL esta sera ejecutada. Pero si a
cualquier dll se la hace pasar por cpl no veremos nada, pues las dll sólo exportan funciones y no tiene código directo.


DLL

1) Nombre de las funciones que exporta
Funcion1:
Funcion2:
Funcion3:
Funcion4:
***********************************
2) Nada de código directo que no necesita exportación.
***********************************
3) Funciones
Función1:
código
end;
Función2:
Código
end;
Función3:
Código
end;
Función4:
Código
end;
************************************

De este modo un programa para utilizar la dll primero tiene que cargarla, luego comprobar que
la función que desa utilizar existe y seguido de ésto llamar a la función.
Entonces lo que pasa cuando esta dll es renombrada a cpl, es que rundll32.exe y shell32.dll
llaman al cpl pero como no estamos diciéndole qué funciones utilizaremos, entonces no sucederá nada.

¿Qué haremos para que funcione?, bien. meteremos codigo en la parte (2) del diagrama (yo lo
he llamado código directo, porque no sé qué nombre tendrá o si es que lo tiene).

CPL

1) Nombre de las Funciones que exporta
Función1:
Función2:
Función3:
Función4:
***********************************
2) Código, llamaré a la función 1.
***********************************
3) Funciones
Función1:
Código
end;
Función2:
Código
end;
Función3:
Código
end;
Función4:
Código
end;
************************************

Ahora nuestro CPL tiene código directo y no necesitamos importar funciones, rundll32.exe y
shell32.dll sólo cargarán el CPL y nuestro código enlazará las demás funciones.

Esta es la teoría, ahora vamos a la práctica.


Este código es para Delphi, un CPL puede hacerse con C++ , ASM o cualquier otro lenguaje decente pero ni lo pienses hacer con VB pues esa cosa solo hace DLL cojas ;), o sea ActiveX, y como todos sabemos para que una dll ActiveX sea ejecutada debe ser registrada en el registro.
Además creo que ni asi funcionaría.

Lo primero es crear un nuevo proyecto, diremos que queremos hacer una DLL.

Veremos lo siguiente.


library Project1;
{bla bla bla, bla bla bla....}

uses
SysUtils,
Classes;

begin

end.


si ésto lo compilamos se creara Project1.dll

Bien, metiéndole mano para que sea un cpl.

library Project1;

uses
SysUtils,
Classes,windows;

Function Caja(Texto,Titulo:pchar):integer;
begin
messagebox(0,texto,titulo,0);
end;

begin
//Este es el código directo
Caja('esto es un CPL','CPL');
end.

lo compilamos, y seguirá siendo Project1.dll, pero le cambiamos la extensión y lo dejamos como cualquiercosa.cpl, ahora hágale doble click. Funcionó!.

Ahora algo interesante:
Copie el CPL a la carpeta de system32 y luego abra el panel de control. jejeje, se ha activado sin necesidad de un doble click.

Bien con lo que hemos hecho, si lo dejamos como DLL y la cargamos desde un programa, inmediatamente aparecera la caja de mensaje. Bueno esto es para enseñar sobre CPLs no sobre DLLs asi que continuemos.

<Lector> a pero yo quiero hacer un CPL que muestre una Form para poder meterle componentes.

Bien ya sabia que alguien preguntón me saldría con esa, asi que estoy preparado.

bien sigamos con nuestro esqueleto de dll tal como lo hemos dejado para que sea CPL, ahora
en el menú demosle a File y NewForm (Estoy utilizando Delphi2).

En las Uses debe haber aparecido Unit1 in 'Unit1.pas' {Form1};

nosotros agregaremos la use Forms y debajo del Begin de nuestro Project1 escribiremos.

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;

debiera quedar parecido a ésto:

library Project1;
{CPL Con Form
Http://Primatelost.i989.net
}
uses
SysUtils,
forms,
Classes,windows,
Unit1 in 'Unit1.pas' {Form1};

Function Caja(Texto,Titulo:pchar):integer;
begin
messagebox(0,texto,titulo,0);
end;

begin
Caja('aun no creamos la Form','CPL');
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


y guardamos nuestro proyecto.

Ahora vamos a cambiarle la extensión a Project1.dll por loquesea.cpl y nuevamente le hacemos
doble click.

Perfectirijillo (Como dijo el maldito Flanders), ahora el CPL muestra una Form, ahora puede meter componentes!!!.


CODIGO.

Éste sería el código de la unit1 (de la Form).

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
messagebox(0,pchar('Holaa esto es un CPL, la form ya esta creada, luego de esto aparecera ella.'),pchar('CPL'),0);
end;

Con ésto finalizamos este texto.



(C) MITOSIS E-Zine/GEDZAC 2002

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT