Ayuda sobre creacion DLL

Ayuda sobre creacion DLL

Postby wmormar » Mon Jan 24, 2022 6: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: 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....
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda sobre creacion DLL

Postby Antonio Linares » Mon Jan 24, 2022 7: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: 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41323
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda sobre creacion DLL

Postby wmormar » Mon Jan 24, 2022 2: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
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda sobre creacion DLL

Postby wmormar » Wed Jan 26, 2022 6: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
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda sobre creacion DLL

Postby Antonio Linares » Wed Jan 26, 2022 8:48 am

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){
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41323
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda sobre creacion DLL

Postby wmormar » Thu Jan 27, 2022 3:56 am

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
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda sobre creacion DLL

Postby Antonio Linares » 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: 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41323
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda sobre creacion DLL

Postby wmormar » Thu Jan 27, 2022 2:08 pm

Estimado Maestro.

Haré pruebas. Gracias Mil. Comento avances.

Saludos
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Ayuda sobre creacion DLL

Postby leandro » Thu Jan 27, 2022 4: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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 12 guests