{"id":672,"date":"2026-03-26T21:43:21","date_gmt":"2026-03-26T21:43:21","guid":{"rendered":"https:\/\/hackcuba.net\/?p=672"},"modified":"2026-03-26T21:43:22","modified_gmt":"2026-03-26T21:43:22","slug":"dll-en-delphi","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=672","title":{"rendered":"DLL en Delphi"},"content":{"rendered":"\n<p>\u00bfQue son las dll? Las Dlls o Librer\u00edas de enlace din\u00e1mico contienen c\u00f3digo ejecutable que es usado por los programas<br>Una de las principales ventajas es que son cargadas una sola vez en memoria y compartidas por varias App Ej. (kernel32.dll, ntdll.dll) que son usadas por varios Programas.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><br>Una biblioteca ahorra espacio en disco y en memoria ya que se carga una sola v\u00e9z, si una biblioteca din\u00e1mica es recompilada las Apps que la usan no tienen que ser recompiladas. Si una Dll no es usada por ning\u00fan proceso esta es descargada autom\u00e1ticamente de la memoria. Si se tiene alg\u00fan c\u00f3digo de una tarea que vaya a ser ejecutada por varias Apps que realicemos es mejor almacenarlo en alguna DLL.<\/p>\n\n\n\n<p>Para crear una DLL vamos a:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"151\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/Cod_41-1.png\" alt=\"\" class=\"wp-image-675\"\/><\/figure>\n\n\n\n<p>Y all\u00ed marcamos la opci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"365\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/Cod_42.png\" alt=\"\" class=\"wp-image-673\" srcset=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/Cod_42.png 441w, https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/Cod_42-300x248.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/figure>\n\n\n\n<p>Hecho esto insertaremos el siguiente c\u00f3digo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\nlibrary blackhat;\nfunction suma(a,b:Integer):Integer;stdcall;\nbegin\nResult:=a+b;\nend;\nfunction resta(a,b:Integer):Integer;stdcall;\nbegin\nResult:=a-b;\nend;\n{$R *.res}\nexports {funciones que se van a exportar}\nsuma,resta;\nbegin\nend.\n<\/pre><\/div>\n\n\n<p>Luego vamos a Project -&gt; Compile blackhat y ya est\u00e1 creada la DLL.<br><\/p>\n\n\n\n<p>\u00bfC\u00f3mo Usarla?<\/p>\n\n\n\n<p>Ahora llamaremos las funciones desde un Prog. Creamos una nueva App y en el form insertamos un componente TEdit y 2 TButton. Copiamos la dll creada al directorio del programa que estamos haciendo ya que al hacer la llamada primero buscara en el dir de la App y luego en las carpetas definidas por el Sistema<br>(System &#8230;). En el codigo del programa insertamos el Siguiente C\u00f3digo:<\/p>\n\n\n\n<p>Debajo de implementation<br>\/\/Hace referencia a la funci\u00f3n suma<br><code>function suma(a,b:Integer):Integer;stdcall external ' blackhat.dll';<\/code><\/p>\n\n\n\n<p>En el evento click del Button1:<br><code>procedure TForm1.Button1Click(Sender: TObject);<br>begin<\/code><\/p>\n\n\n\n<p>\/\/Llamamos a la funci\u00f3n<br><code>Edit1.Text:=IntToStr(suma(5,6));<br>end;<\/code><\/p>\n\n\n\n<p>En el Evento Click del Button2:<\/p>\n\n\n\n<p><code>procedure TForm1.Button2Click(Sender: TObject);<br>var<br>lib:HINST;<\/code><\/p>\n\n\n\n<p><code><br>resta:function (a,b:Integer):Integer;stdcall;<br>pfunc:Pointer;<br>begin<br>lib:=LoadLibrary(' blackhat.dll');<br>if lib&lt;&gt;0 then<br>begin<br>pfunc:=GetProcAddress(lib,pchar('resta'));<br>@resta:=pfunc;<br>Edit1.Text:=IntToStr(resta(10,6));<br>FreeLibrary(lib);<br>end<br>else<br>ShowMessage('La dll no ha podido cargarse');<br>end;<\/code><br><\/p>\n\n\n\n<p>\u00bfQu\u00e9 es stdcall?<\/p>\n\n\n\n<p>Stdcall es el modo en que se pasan los par\u00e1metros a la pila en las funciones de la API de Windows as\u00ed que para que nuestra App pueda ser usada desde diferentes lenguajes de programaci\u00f3n debemos pasar los par\u00e1metros de esta manera. Existen otros convenios de llamada como pascal,register,safecall(el usado por el delphi),cdel en Stdcall los par\u00e1metros se pasan de derecha a izquierda empezando por el ultimo.<\/p>\n\n\n\n<p>La llamada a la siguiente funci\u00f3n:<br><code>MessageBox (Handle,'Titulo de la Ventana','Mensaje',MB_OK);<\/code><\/p>\n\n\n\n<p>Es interpretada como:<br><code>PUSH Handle<br>PUSH Titulo de la Ventana<br>PUSH Mensaje<br>PUSH MB_OK<br>CALL MessageBox \/\/ Llama a la funci\u00f3n MessageBox.<\/code><\/p>\n\n\n\n<p>El m\u00e9todo en que es llamada la funci\u00f3n suma carga la dll al iniciar el programa y la mantiene en memoria Durante toda la ejecuci\u00f3n y solo es liberada la memoria ocupada cuando este finaliza. Sin embargo el modo en que llamamos la funci\u00f3n resta solo carga la Dll en memoria cuando es necesaria y luego la libera. Este m\u00e9todo es un poco complejo pero se tiene muchomM\u00e1s control de la App y nos ahorra recursos.<\/p>\n\n\n\n<p><code>var<br>lib:HINST;<\/code><\/p>\n\n\n\n<p>Es Equivalente al tipo de dato Cardinal<br><code>HINST (Handle a una instancia)<\/code><\/p>\n\n\n\n<p><code>resta:function (a,b:Integer):Integer;stdcall;<\/code><br>Declaramos la variable de tipo funci\u00f3n<\/p>\n\n\n\n<p><code>pfunc: Pointer;<br><\/code>Puntero sin tipo puede apuntar a cualquier tipo de dato. Lo usamos para apuntar a la direcci\u00f3n de la funci\u00f3n resta<\/p>\n\n\n\n<p><code>Begin<br>lib:=LoadLibrary(' blackhat.dll');<br><\/code>La funci\u00f3n LoadLibrary forma parte del API de Windows y se encuentra en la librer\u00eda kernel32.dll es la encargada de cargar en memoria las Dlls existen otras func con mas par\u00e1metros y avanzadas como LoadLibraryEx.<br><code><br>if lib&lt;&gt;0 then<\/code><br>Si la carga de la dll es satisfactoria ejecutamos lo sigte.<\/p>\n\n\n\n<p><code>begin<br>pfunc:=GetProcAddress(lib,pchar('resta'));<br><\/code>Con GetProcAddress obtenemos la direcci\u00f3n en memoria<br>De la funci\u00f3n resta.<br><br><code>@resta:=pfunc;<br><\/code>Ahora la variable resta apunta a la posici\u00f3n de memoria<br>De la funci\u00f3n del mismo nombre.<\/p>\n\n\n\n<p><code>Edit1.Text:=IntToStr(resta(10,6));<br><\/code>Hacemos la llamada a la funcion<\/p>\n\n\n\n<p><code>FreeLibrary(lib);<br><\/code>Liberamos la librer\u00eda despu\u00e9s de usarla.<\/p>\n\n\n\n<p>Escrito por Reinier N\u00e1poles Mart\u00ednez [rnapoles@ipihlg.rimed.cu]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQue son las dll? Las Dlls o Librer\u00edas de enlace din\u00e1mico contienen c\u00f3digo ejecutable que es usado por<\/p>\n","protected":false},"author":2,"featured_media":119,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,36],"tags":[207,89,58,38],"class_list":["post-672","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-proyecto-blackhat","tag-dll","tag-pascal","tag-programacion","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/672","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=672"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/672\/revisions"}],"predecessor-version":[{"id":676,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/672\/revisions\/676"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/119"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}