FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda sobre creacion DLL
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM

Ayuda sobre creacion DLL

Posted: Mon Jan 24, 2022 06:31 AM
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 (fw): Select all Collapse
/* 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 (fw): Select all Collapse
/*dll.h*/
#ifndef _DLL_H_
#define _DLL_H_

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

#endif


Code (fw): Select all Collapse
/* 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....
William, Morales

Saludos



méxico.sureste
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Ayuda sobre creacion DLL

Posted: Mon Jan 24, 2022 07:31 AM
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 (fw): Select all Collapse
@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 (fw): Select all Collapse
@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 (fw): Select all Collapse
-hbdyn
-oprueba01

-cflag=-TP

dllmain.cpp
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM

Re: Ayuda sobre creacion DLL

Posted: Mon Jan 24, 2022 02:37 PM

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

William, Morales

Saludos



méxico.sureste
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM

Re: Ayuda sobre creacion DLL

Posted: Wed Jan 26, 2022 06:00 AM

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

William, Morales

Saludos



méxico.sureste
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Ayuda sobre creacion DLL

Posted: Wed Jan 26, 2022 08:48 AM
William,

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


debiera ser:
Code (fw): Select all Collapse
            sumar = (int (__stdcall *) (int, int)) GetProcAddress(hDll,"suma");
            if (sumar){
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM

Re: Ayuda sobre creacion DLL

Posted: Thu Jan 27, 2022 03:56 AM
Estimado Maestro.

Solo colandole el siguiente codigo sin problema acceso a la DLL

Code (fw): Select all Collapse
#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 (fw): Select all Collapse
/* 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
William, Morales

Saludos



méxico.sureste
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: Ayuda sobre creacion DLL

Posted: Thu Jan 27, 2022 10:09 AM
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 (fw): Select all Collapse
@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 (fw): Select all Collapse
test.prg

-gui

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

-lfiveh64
-lfivehc64
-lgdiplus
-lversion
-loledlg

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


regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM

Re: Ayuda sobre creacion DLL

Posted: Thu Jan 27, 2022 02:08 PM

Estimado Maestro.

Haré pruebas. Gracias Mil. Comento avances.

Saludos

William, Morales

Saludos



méxico.sureste
Posts: 1818
Joined: Wed Oct 26, 2005 02:49 PM

Re: Ayuda sobre creacion DLL

Posted: Thu Jan 27, 2022 04:54 PM

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

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]

Continue the discussion