Clarion - Usar un proc de una DLL (no de clarion)

 
Vista:

Usar un proc de una DLL (no de clarion)

Publicado por GABRIELA (4 intervenciones) el 14/12/2007 12:51:05
Alguien sabe como usar un procedimiento o funcion definida en una DLL, compilada en otro lenguaje??
Hasta ahora siempre he usado DLL's de clarion pero cuando quise intentar ingresarla al proyecto como una externalDLL, no reconoce el nombre del procedimiento.

Muchas gracias
Gabriela
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Usar un proc de una DLL (no de clarion)

Publicado por esbxp (12 intervenciones) el 15/12/2007 03:35:48
hasta donde yo se sino esta en el API de window debes llamarla con load library... si esta hecha en C/C++ exporta sus funciones con el modulo *.def
Si la cargas con loadLibrary necesitas un puntero... al procedimiento,,, y hasta aqui mas o menos he llegado,, poque me aparece un access violation,,, cuando intento un GlobalAlloc dentro del DLL o malloc,,, las variables para que las reconosca la DLL,,, deben tener marcado el attributo thread...
obten la lib con el utilitario LibMaker,, que viene con Clarion...
con WinApi extrae la declaracion de prototipos,,, y tipos de variames más las estructuras.... dale un vistazo a este Winsock.clw,,, y WinNet.clw,,, que permiten mantener conecciones http, y ftp via internet.... aqui hay un estracto de aquellos prototipos,,,
SOCKADDR GROUP,TYPE
sa_family USHORT !address family
sa_data CSTRING(14) !up to 14 bytes of direct address
END
MODULE('WSOCK32.LIB')
!int PASCAL FAR connect (SOCKET s, const struct sockaddr FAR *name, int namelen);
s32_connect(SOCKET,*SOCKADDR_IN,SHORT),SHORT,RAW,PASCAL,NAME('CONNECT'),DLL(dll_mode)

!int PASCAL FAR getsockname (SOCKET s, struct sockaddr FAR *name,
! int FAR * namelen);
s32_getsockname(SOCKET,*SOCKADDR,*SHORT),SHORT,RAW,PASCAL,NAME('GETSOCKNAME'),DLL(dll_mode)
END

fijate que para puntero usan PASCAL, RAW, mas el DLL(dll_mode)

pero esto es con el API,,, si compilas en VC,,, despues que obtengas la DLL,,, obten la libreria,, con LibMaker,,, no te sirve la libreria del Vc...
weno espero te ayude,,, Crea un Puntero adentro,,, y trata que el resultado de la funcion sea devolver una estructura Re-alojada en memoria dentro de la DLL,,,
avisame si se safas de Access Violation....

please....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Usar un proc de una DLL (no de clarion)

Publicado por esbxp (12 intervenciones) el 15/12/2007 21:18:53
Hola Yo denuevo:
Tego una repuesta más contundente que la anterior,, pues he descubierto el Problema, la DLL si es en VC, debes recordar esta cabecera. Los MessageBox, estan en comentarios, pero si quieres puedes sacarlos para saber por donde pasa la ejecucion,, esto es digamos el

Paso 1: Declarar DLL en VC

BOOL APIENTRY DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason){
case DLL_PROCESS_ATTACH:
//MessageBox(NULL, "PROCESS_ATTACH","DLLCodes.DLL", MB_OK);
break;
case DLL_PROCESS_DETACH:
//MessageBox(NULL, "PROCESS_DETACH","DLLCodes.DLL", MB_OK);
break;

case DLL_THREAD_ATTACH:
//MessageBox(NULL, "THREAD_ATTACH","DLLCodes.DLL", MB_OK);
break;
case DLL_THREAD_DETACH:
//MessageBox(NULL, "THREAD_ATTACH","DLLCodes.DLL", MB_OK);
break;
}
return TRUE;
}

Paso 2: Crear los Prototipo exportables,, y anotarlos siguiendo la Sintaxis del Modulo DEF de VC de ecportacion

bool ReadKeys(char *StrFile)
{
return true;
}

bool UbicarSerial(char *StrResult, int AlgunParametro)
{
return true;
}

Paso 3: El Modulo Def de Exportacion
LIBRARY DLLCodes
EXPORTS
ReadKeys @1
UbicarSerial @2

Paso 4: La Equivalencia de Prototipo en el Map de Clarion
Recuerda C, RAW, para pasar solamente la Direccion, con esto puedes asignar con las funciones, GlobalAlloc, LocalAlloc, VirtualAlloc, he incluso las viejas funciones malloc, calloc, y realloc. ok.

MODULE('DLLCodes.lib')
ReadKeys(*CString),byte, C, RAW, NAME('ReadKeys')
UbicarSerial(*CString, Long), byte, C, RAW, NAME('UbicarSerial')
END

FileName *CString(40)
SerialName *CString(40)

Paso 5: La Declaracion,,, variables y prototipos.

Con esto ya la puedes llamar,, ojo,, aui hay algo importante,, Si la DLL no tiene th read multiple, como este ejemplo,, la puedes llamar,,,
pero si es de thread,, multiple,, osea la llamas de mas de una "Aplicacion.exe", corriendo al mismo tiempo,,, debes colocar al final de la declaracion de la función algo como :
a) ..... Name('ReadKeys'), dll(dll_mode)
ye en la Variable:
b) ..... FileName *CString(40), thread
..... SerialName *CString(40), thread

Paso 6: La llamada
Con esto ya puedes llamar la funcion, sin ningun problema,, solo asegurate que los pointers CString, u otros sean lo suficientemente largos para contener el Resultado...

Code
FileName = '.FileData.dta'
if( ReadKeys( FileName))then
if ( UbicarSerial( SerialName, 87648754) )then
Stop('Resultado desde C++: ' & SerialName )
end
end
Return

Ok,,, Comprebalo,, en realidad esto no lo dice el Manual ,, en ninguna parte y tampoco lo explica nadie,, asi que puedes sentirte feliz,, y yo igual es la unica forma en la que funciona,, no hay otra.... jajajjajaj

bye !!!
esbxp.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Usar un proc de una DLL (no de clarion)

Publicado por Gabriela (4 intervenciones) el 19/12/2007 14:14:55
Mil gracias, lo voy a probar.

Saludos
Gabriela
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Usar un proc de una DLL (no de clarion)

Publicado por Bernardo (4 intervenciones) el 03/09/2008 17:49:58
Hola, estoy tratando de usar una dll (que no es de clarion) siguiendo los pasos que explicas pero no tuve exito.
La dll es io.dll y se utiliza para manejar el puerto paralelo, yo genero io.lib con el libmaker, incluyo en el inside the GLOBAL MAP de la siguiente forma

MODULE('IO.LIB')
PortOut (ULONG,BYTE),C,RAW,NAME('PortOut')
!en VB: Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
END

En un boton de mi ventana principal ejecuto la funcion de la siguiente forma:

PortOut(address('H378'),1)

Cuando compilo me da error "Unresolved External PortOut in Prueb001.obj"

Te pido si podrias ayudarme.

Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Usar un proc de una DLL (no de clarion)

Publicado por Bernardo (4 intervenciones) el 06/09/2008 00:02:20
Yo otra vez, ya solucione el problema que me daba al compilar gracias a la ayuda de Fernando Cerini, incluyendo el archivo io.lib e io.dll en el proyecto, yendo a Proyect Edit -> Librery, Object, and resource files.
Bueno, parece que estoy haciendo algo mal, por que a veces cuando ejecuto una centencia se me reinicia la pc :) y todabia no puedo encender ningun led :(

Sera bienvenida una ayudita. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar