RE:Usar un proc de una DLL (no de clarion)
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.-