Page 1 of 1

Antonio S.O.S.... PCODE DLL no funciona

Posted: Wed Dec 19, 2007 6:49 pm
by Cgallegoa
Hola Antonio:

Lamento molestar, pero como he explicado en post anteriores dependemos en nuestra aplicaciones del uso intensivo de código en DLL´s.

Algo tan sencillo como lo siguiente, no logramos hacerlo funcionar con FWH y xHarbour 1.1.0:

TESTDLLP.PRG
#include "FiveWin.ch"

REQUEST DBFCDX

STATIC oWnd

Function Inicio()
LOCAL oMenu
LOCAL hDll := LibLoad( "MSTDLL1.DLL" )
RddSetDefault("DBFCDX")
MENU oMenu
MENUITEM "Prueba" ACTION Hb_LibDo("ProduccDll","1")
MENUITEM "&Terminar" ACTION oWnd:End()
ENDMENU
DEFINE WINDOW oWnd TITLE "Usando PCode DLL" MDI MENU oMenu
ACTIVATE WINDOW oWnd
LibFree( hDLL )
Return(NIL)



PCODEDLL.PRG
#include "FiveWin.ch"

Function ProduccDll(cAccion)
dbuseArea(.T.,,"PRUEBA2.DBF","prueba")
wBrowse()
dbCloseAll()
Return(nil)


Podrías ayudarme indicándome qué hace falta ?

Perdona que insista, pero me ayudaría mucho, si logras hacerlo funcionar, que me enviases una explicación para niños de cómo lo hiciste, incluído el script para general la Dll. Definitivamente nostros no pudimos. :cry:

Saludos,

Carlos Gallego

Posted: Wed Dec 19, 2007 6:54 pm
by Cgallegoa
Antonio, se me fueron la luces. Por favor corregir:

Cambiar LOCAL hDll := LibLoad( "MSTDLL1.DLL" )
Por LOCAL hDll := LibLoad( "PCODEDLL.DLL" )

Y como no envié la base PRUEBA2.DBF, por favor prueba con cualquiera.

Saludos,

Carlos Gallego

Posted: Wed Dec 19, 2007 8:28 pm
by Antonio Linares
Carlos,

Tu ejemplo funciona perfectamente. Sólo tienes que añadir:

1) a TESTDLLP.prg:

REQUEST DBFCDX, DBUSEAREA, WBROWSE, DBCLOSEALL

2) a PCODEDLL.prg:

DYNAMIC dbuseArea
DYNAMIC wBrowse
DYNAMIC dbCloseAll
DYNAMIC GETPROCADDRESS
DYNAMIC TACTIVEX
DYNAMIC ERRORSYS

Si quieres te envio el EXE y la DLL para que los pruebes ahí :-)

Image

Posted: Wed Dec 19, 2007 8:42 pm
by Cgallegoa
Hola Antonio:

Gracias, funcionó bien. Me quedan tres prueguentas:

1.-Cada función o procedure (Clipper, fivewin o progra) que sea invocado en la DLL deberá citarse con REQUEST en el programa PRINICIPAL y su contraparte como DYNAMIC en la DLL. Es correcto ? Observo que tienen que ir al comienzo del PRG

2.- En una DLL con mucho código, se pueden estar invocando decenas de funciones/procedures, entonces, cuál sería la forma de incluírlas tanto en el programa principal como en la DLL que no sea tan tedioso y tenga que declararse una por una. Pordría ser, por ejemplo, poniéndolas en un archivo tipo INCLUDE, ejemplo, "LosRequest.ch" y "LosDynamics.ch" ? o de qué manera ?

3.- Cómo controlar el error dentro de la DLL, en cuál línea se produce y cuál es el error. No saca ningún mensaje aparte del típico de Windows. Tampoco reconoce logfile.

Saludos,

Carlos Gallego

Posted: Wed Dec 19, 2007 9:08 pm
by Antonio Linares
Carlos,

>
1.-Cada función o procedure (Clipper, fivewin o progra) que sea invocado en la DLL deberá citarse con REQUEST en el programa PRINICIPAL y su contraparte como DYNAMIC en la DLL. Es correcto ?
>



> Observo que tienen que ir al comienzo del PRG

No necesariamente. Es lo típico, pero puedes usar REQUEST al final, etc.

>
poniéndolas en un archivo tipo INCLUDE, ejemplo, "LosRequest.ch" y "LosDynamics.ch" ?
>

Sí, sería lo idóneo

>
3.- Cómo controlar el error dentro de la DLL, en cuál línea se produce y cuál es el error. No saca ningún mensaje aparte del típico de Windows. Tampoco reconoce logfile.
>

Aqui la gestión de errores en la DLL funciona perfectamente. Modifica tu ejemplo de esta forma:

Function ProduccDll(cAccion)
x++

y aparece la ventana de errores de FWH dando la información correcta:

Error description: Error BASE/1003 Variable does not exist: X

Stack Calls
===========
Called from: pcodedl2.prg => PRODUCCDLL(4)
Called from: => HB_LIBDO(0)
Called from: cgallego.prg => (b)INICIO(12)
Called from: MENU.PRG => TMENU:COMMAND(0)
Called from: WINDOW.PRG => TWINDOW:COMMAND(0)
Called from: MDIFRAME.PRG => TMDIFRAME:COMMAND(0)
Called from: => TMDIFRAME:HANDLEEVENT(0)
Called from: WINDOW.PRG => _FWH(0)
Called from: => WINRUN(0)
Called from: WINDOW.PRG => TMDIFRAME:ACTIVATE(0)
Called from: cgallego.prg => INICIO(16)

Estás usando un gestor de errores distinto al estandard de FWH ?

Posted: Wed Dec 19, 2007 9:27 pm
by Cgallegoa
Muy bien.

>
1.-Cada función o procedure (Clipper, fivewin o progra) que sea invocado en la DLL deberá citarse con REQUEST en el programa PRINICIPAL y su contraparte como DYNAMIC en la DLL. Es correcto ?
>

< Sí >

Esto incluye dbeval, dbgotop, dbgoto, dbgobottom, recno, etc., etc, etc. ?

Es decir, toca hacer un include kilométrico con todas las funciones de Clipper / xHarbour . :? Alguna idea ?

< Estás usando un gestor de errores distinto al estandard de FWH ? >

No. A veces toma el gestor normal de errores de FW, otras veces manda la ventana de Windows, que no dice nada.

En todo caso vamos avanzando. Que con tu ayuda terminanos el año domando las condenadas DLLs :D

Saludos,

Carlos Gallego

Posted: Wed Dec 19, 2007 9:33 pm
by Antonio Linares
Carlos,

Esto puede servirte :-)

Code: Select all

   REQUEST ;
   AADD,;            
   ABS,;             
   ACHOICE,;         
   ACLONE,;          
   ACOPY,;           
   ADEL,;            
   ADIR,;            
   AEVAL,;           
   AFIELDS,;         
   AFILL,;           
   AINS,;            
   ALERT,;           
   ALIAS,;           
   ALLTRIM,;         
   AMPM,;            
   ARRAY,;           
   ASC,;             
   ASCAN,;           
   ASIZE,;           
   ASORT,;           
   AT,;              
   ATAIL,;           
   BIN2I,;           
   BIN2L,;           
   BIN2U,;           
   BIN2W,;           
   BOF,;             
   BROWSE,;          
   CDOW,;            
   CHR,;             
   CMONTH,;          
   COL,;             
   CTOD,;            
   CURDIR,;          
   DATE,;            
   DAY,;             
   DAYS,;            
   DBAPPEND,;        
   DBCLEARFILTER,;   
   DBCLEARINDEX,;    
   DBCLEARRELATION,; 
   DBCLOSEALL,;      
   DBCLOSEAREA,;     
   DBCOMMIT,;        
   DBCOMMITALL,;     
   DBCREATE,;        
   DBCREATEINDEX,;   
   DBDELETE,;        
   DBEDIT,;          
   DBEVAL,;          
   DBF,;             
   DBFILTER,;        
   DBGOBOTTOM,;      
   DBGOTO,;          
   DBGOTOP,;         
   DBRECALL,;        
   DBREINDEX,;       
   DBRELATION,;      
   DBRLOCK,;         
   DBRLOCKLIST,;     
   DBRSELECT,;       
   DBRUNLOCK,;       
   DBSEEK,;          
   DBSELECTAREA,;    
   DBSETDRIVER,;     
   DBSETFILTER,;     
   DBSETINDEX,;      
   DBSETORDER,;      
   DBSETRELATION,;   
   DBSKIP,;          
   DBSTRUCT,;        
   DBUNLOCK,;        
   DBUNLOCKALL,;     
   DBUSEAREA,;       
   DELETED,;         
   DESCEND,;         
   DEVOUT,;          
   DEVOUTPICT,;      
   DEVPOS,;          
   DIRECTORY,;       
   DIRCHANGE,;       
   DIRREMOVE,;       
   DISKSPACE,;       
   DISPBEGIN,;       
   DISPCOUNT,;       
   DISPEND,;         
   DISPOUT,;         
   DOW,;             
   DTOC,;            
   DTOS,;            
   ELAPTIME,;        
   EMPTY,;           
   EOF,;             
   ERRORNEW,;        
   EVAL,;            
   EXP,;             
   FCLOSE,;          
   FCOUNT,;          
   FCREATE,;         
   FERASE,;          
   FERROR,;          
   FIELD,;           
   FIELDBLOCK,;      
   FIELDGET,;        
   FIELDNAME,;       
   FIELDPOS,;        
   FIELDPUT,;        
   FIELDWBLOCK,;     
   FILE,;            
   FLOCK,;           
   FOPEN,;           
   FOUND,;           
   FREAD,;           
   FREADSTR,;        
   FRENAME,;         
   FSEEK,;           
   FWRITE,;          
   GETACTIVE,;       
   GETAPPLYKEY,;     
   GETDOSETKEY,;     
   GETENV,;          
   GETNEW,;          
   GETPREVALIDATE,;  
   GETPOSTVALIDATE,; 
   GETREADER,;       
   HARDCR,;          
   HB_ANSITOOEM,;    
   HB_DISKSPACE,;    
   HB_FEOF,;         
   HB_OEMTOANSI,;    
   HEADER,;          
   I2BIN,;           
   IF,;              
   INDEXEXT,;        
   INDEXKEY,;        
   INDEXORD,;        
   INKEY,;           
   INT,;             
   ISAFFIRM,;        
   ISALPHA,;         
   ISDIGIT,;         
   ISDISK,;          
   ISLOWER,;         
   ISNEGATIVE,;      
   ISUPPER,;         
   L2BIN,;           
   LASTKEY,;         
   LASTREC,;         
   LEFT,;            
   LEN,;             
   LOG,;             
   LOWER,;           
   LTRIM,;           
   LUPDATE,;         
   MAKEDIR,;         
   MAX,;             
   MAXCOL,;          
   MAXROW,;          
   MCOL,;            
   MEMOEDIT,;        
   MEMOTRAN,;        
   MEMOLINE,;        
   MEMORY,;          
   MEMOREAD,;        
   MEMOTRAN,;        
   MEMOWRIT,;        
   MEMVARBLOCK,;     
   MIN,;             
   MLCOUNT,;         
   MLCTOPOS,;        
   MLPOS,;           
   MOD,;             
   MONTH,;           
   MPOSTOLC,;        
   MROW,;            
   NATIONMSG,;       
   NETERR,;          
   NETNAME,;         
   NEXTKEY,;         
   ORDBAGEXT,;       
   ORDBAGNAME,;      
   ORDCREATE,;       
   ORDDESTROY,;      
   ORDFOR,;          
   ORDKEY,;          
   ORDLISTADD,;      
   ORDLISTCLEAR,;    
   ORDLISTREBUILD,;  
   ORDNAME,;         
   ORDNUMBER,;       
   ORDSETFOCUS,;     
   OS,;              
   OUTERR,;          
   OUTSTD,;          
   PADC,;            
   PADL,;            
   PADR,;            
   PCOL,;            
   PCOUNT,;          
   PROCFILE,;        
   PROCLINE,;        
   PROCNAME,;        
   PROW,;            
   RAT,;             
   RDDLIST,;         
   RDDNAME,;         
   RDDSETDEFAULT,;   
   READEXIT,;        
   READUPDATED,;     
   READINSERT,;      
   READKEY,;         
   READFORMAT,;      
   READKILL,;        
   READMODAL,;       
   READUPDATED,;     
   READVAR,;         
   RECCOUNT,;        
   RECNO,;           
   RECSIZE,;         
   REPLICATE,;       
   RESTSCREEN,;      
   RIGHT,;           
   RLOCK,;           
   ROUND,;           
   ROW,;             
   RTRIM,;           
   SAVESCREEN,;      
   SCROLL,;          
   SECONDS,;         
   SECS,;            
   SELECT,;          
   SET,;             
   SETCOLOR,;        
   SETCURSOR,;       
   SETKEY,;          
   SETMODE,;         
   SETPOS,;          
   SETPRC,;          
   SETTYPEAHEAD,;    
   SPACE,;           
   SQRT,;            
   STR,;             
   STRTRAN,;         
   STRZERO,;         
   STUFF,;           
   SUBSTR,;          
   TBROWSENEW,;      
   TBROWSEDB,;       
   TBCOLUMNNEW,;     
   TIME,;            
   TONE,;            
   TRANSFORM,;       
   TRIM,;            
   TYPE,;            
   U2BIN,;           
   UPDATED,;         
   UPPER,;           
   USED,;            
   VAL,;             
   VALTYPE,;         
   VERSION,;         
   W2BIN,;           
   WORD,;            
   HB_FNAMESPLIT,;   
   HB_FNAMEMERGE

Posted: Wed Dec 19, 2007 9:34 pm
by Antonio Linares
Carlos,

> ... otras veces manda la ventana de Windows, que no dice nada.

A ver si pudieses conseguirme un ejemplo que genere un error de esos, gracias :-)