Page 1 of 1

Ayuda sobre creacion DLL

PostPosted: Mon Jan 24, 2022 6:31 am
by wmormar
Amigos, tiempo sin escribir, aunque siempre "veo" los foros.

Tengo la necesidad de crear una DLL y llamarla desde un PRG, he visto muchos ejemplos y ando sin poder hacerla funcionar. Tengo los siguientes codigos. Toda la ayuda sera bienvenida...

Code: Select all  Expand view

/* dllmain.cpp */

#include "dll.h"
#include <windows.h>

extern "C" __declspec(dllexport)
int suma(int a, int b)
{
    return a + b;
}

int longitud(char *cadena)
{
    int len = 0;
    for(int i=0; ; i++)
    {
        if(cadena[ i ] == '\0')
           break;
           
        len ++;
    }
    return len;
}

extern "C" __declspec(dllexport)
int es_palindroma(char *cadena)
{
   int i;
   char invertida[50];

   /* Halla la cadena invertida */
   for(i=0; i < longitud(cadena); i++)
       invertida[ i ] = cadena[longitud(cadena)-i-1];

   /* Coloca caracter de fin de cadena */
   invertida[ i ] = '\0';

   /* Realiza la comparacion */
   if(!strcmp(cadena, invertida))
      return 1; /* es un palindromo */
         
   return 0;  /* no es un palindromo */
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
 


Code: Select all  Expand view

/*dll.h*/
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
#define DLLIMPORT __declspec(dllexport)
#else
#define DLLIMPORT __declspec(dllimport)
#endif

#endif
 


Code: Select all  Expand view

/* prueba.prg*/
#include "fivewin.ch"

STATIC hDLL

FUNCTION main()


   ? "Aqui vamos. Iniciando..."
   ? "HELLO DLL", wmhellocw()
   ? "Terminamos"

RETURN NIL

/*-----------------------------------------------------------------------------------------------*/
#pragma BEGINDUMP
   #include <hbapi.h>
   #include <windows.h>

/*-----------------------------------------------------------------------------------------------*/
   typedef int (WINAPI * WMSUMA) (int, int);

/*-----------------------------------------------------------------------------------------------*/
   HANDLE         hDll;
   WMSUMA         sumar;
   int            result;
   char*          cIncos = "prueba01  :: INCOS";

/*-----------------------------------------------------------------------------------------------*/
   HB_FUNC( WMHELLOCW )
   {
      hDll = LoadLibrary( "prueba01.dll" );

      if (!hDll)
         {
            MessageBox( 0, "Imposible cargar DLL-new_C, verifique...", cIncos, 1 );
            hb_retni(0);
         }
      else
         {
            MessageBox( 0, "DLL cargada...", cIncos, 1 );
            //sumar = (WMSUMA) GetProcAddress( hDll, "suma" );
            sumar = (int (__stdcall *) (int, int)) GetProcAddress(hDll,"suma");
            if (!sumar){
               MessageBox( 0, "carga suma...", cIncos, 1 );
               result = sumar(5, 6);
               MessageBox( 0, "ejecuta sumar...", cIncos, 1 );
            } else {
               MessageBox( 0, "no se cargo funcion suma...", cIncos, 1 );
            }

            FreeLibrary(hDll);
            hb_retni(result);
         }
   }

/*-----------------------------------------------------------------------------------------------*/
   HB_FUNC( WMHELLO )
   {
      hb_retc( "MORALES" );
   }

/*-----------------------------------------------------------------------------------------------*/

#pragma ENDDUMP
 


Espero ayuda amigos. Agradezco de antemano....

Re: Ayuda sobre creacion DLL

PostPosted: Mon Jan 24, 2022 7:31 am
by Antonio Linares
William,

Que compilador de C usas y cómo estás construyendo la DLL ?

Aqui se construye bien usando hbmk2

para construirla en 32 bits usa este go32.bat
Code: Select all  Expand view
@set oldpath=%path%
@set oldinclude=%INCLUDE%
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
c:\harbour\bin\win\msvc\hbmk2 dll.hbp -comp=msvc
@set path=%oldpath%
@set INCLUDE=%oldinclude%


Para construirla en 64 bits usa este go64.bat:
Code: Select all  Expand view
@set oldpath=%Path%
@set oldinclude=%INCLUDE%
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
c:\harbour\bin\win\msvc64\hbmk2 dll.hbp -comp=msvc64
@set Path=%oldpath%
@set INCLUDE=%oldinclude%


dll.hbp
Code: Select all  Expand view
-hbdyn
-oprueba01

-cflag=-TP

dllmain.cpp

Re: Ayuda sobre creacion DLL

PostPosted: Mon Jan 24, 2022 2:37 pm
by wmormar
Estimado Maestro Linares.

La construyo directamente en DEV-C++. Comento que desde DEV-C++ he logrado cargar la DLL sin problema. Pero al momento de querer hacerlo desde un PRG igual al codigo que mostré no logro hacer que cargue la funcion. He logrado hacer que la DLL cargue pero no la funcion.

Checare a generarla con el codigo que muestras Maestro.

Alguna ayuda para generar con DEV-C++ seria bien recibida.

Saludos Cordiales

Re: Ayuda sobre creacion DLL

PostPosted: Wed Jan 26, 2022 6:00 am
by wmormar
Maestro,

No, mismo proceso. Logro acceder a la DLL pero no a la funcion suma(). Usando el proceso que me menciona.

Algun consejo adicional?

Saludos

Re: Ayuda sobre creacion DLL

PostPosted: Wed Jan 26, 2022 8:48 am
by Antonio Linares
William,

Este código:
Code: Select all  Expand view
           sumar = (int (__stdcall *) (int, int)) GetProcAddress(hDll,"suma");
            if (!sumar){
 


debiera ser:
Code: Select all  Expand view
           sumar = (int (__stdcall *) (int, int)) GetProcAddress(hDll,"suma");
            if (sumar){
 

Re: Ayuda sobre creacion DLL

PostPosted: Thu Jan 27, 2022 3:56 am
by wmormar
Estimado Maestro.

Solo colandole el siguiente codigo sin problema acceso a la DLL

Code: Select all  Expand view
#include <windows.h>

extern "C"
void __declspec(dllexport) WINAPI TuFuncion ()
{
 MessageBox (NULL,
             "Estamos dentro de la function de tu dll",
             "Perifericos",
             NULL );
 
 return;
}

extern "C"
int __declspec(dllexport) WINAPI suma(int a = 0, int b = 0)
{
    return a + b;
}


Pero si coloco lo siguiente no me da resultado, se congela y termina posteriormente.

Code: Select all  Expand view
/* dllmain.cpp */

#include "dll.h"
#include <windows.h>

extern "C" __declspec(dllexport)
int suma(int a, int b)
{
    return a + b;
}

int longitud(char *cadena)
{
    int len = 0;
    for(int i=0; ; i++)
    {
        if(cadena[ i ] == '\0')
           break;
           
        len ++;
    }
    return len;
}

extern "C" __declspec(dllexport)
int es_palindroma(char *cadena)
{
   int i;
   char invertida[50];

   /* Halla la cadena invertida */
   for(i=0; i < longitud(cadena); i++)
       invertida[ i ] = cadena[longitud(cadena)-i-1];

   /* Coloca caracter de fin de cadena */
   invertida[ i ] = '\0';

   /* Realiza la comparacion */
   if(!strcmp(cadena, invertida))
      return 1; /* es un palindromo */
         
   return 0;  /* no es un palindromo */
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
 


Como ve maestro Linares?

Gracias de antemano

Re: Ayuda sobre creacion DLL

PostPosted: Thu Jan 27, 2022 10:09 am
by Antonio Linares
William,

Aqui funciona correctamente con el cambio que te he indicado en el código y usando estos ficheros para construir el EXE:

go64.bat
Code: Select all  Expand view
@set oldpath=%Path%
@set oldinclude=%INCLUDE%
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
c:\harbour\bin\win\msvc64\hbmk2 test64.hbp -comp=msvc64
@set Path=%oldpath%
@set INCLUDE=%oldinclude%


test64.hbp
Code: Select all  Expand view
test.prg

-gui

-Ic:\fwh64\include
-Lc:\fwh64\lib

-lfiveh64
-lfivehc64
-lgdiplus
-lversion
-loledlg

xhb.hbc
hbct.hbc
hbwin.hbc
hbmzip.hbc
hbziparc.hbc


Image

Re: Ayuda sobre creacion DLL

PostPosted: Thu Jan 27, 2022 2:08 pm
by wmormar
Estimado Maestro.

Haré pruebas. Gracias Mil. Comento avances.

Saludos

Re: Ayuda sobre creacion DLL

PostPosted: Thu Jan 27, 2022 4:54 pm
by leandro
Amigo William buenos días, que bueno que nos sigas. :D

Me puedes escribir al correo, necesito hacerte una pequeña pregunta sobre INCOSBUS?

De antemano gracias

leandroalfonso111@hotmail.com