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.
Saludos,
Carlos Gallego
Antonio S.O.S.... PCODE DLL no funciona
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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í
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í
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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 ?
>
Sí
> 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 ?
>
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í
> 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 ?
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
Saludos,
Carlos Gallego
>
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
Saludos,
Carlos Gallego
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Carlos,
Esto puede servirte
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: