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 RUN
/* 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 RUN
/*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 RUN
/* 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....