Discussion:
Descomprimir con unrar.dll
(demasiado antiguo para responder)
Petit78
2007-12-07 21:11:04 UTC
Permalink
Buenas a todos.
Estoy trabajando con VFP9 SP2 y para descomprimir fichero RAR estoy
utilizando la DLL que hay en http://www.winrar.es/descargas/fuentes de
la página oficial.
Mi problema es que al ejecutar la descompresión me da el error 9: data
type mismatch.

El código utilizado es:

Declare LONG RAROpenArchive IN unrar.dll STRING@ ArchiveData

LOCAL lHandle As Long, uRar as object

uRAR= CREATEOBJECT("EMPTY")
ADDPROPERTY(uRAR,"ArcName",'')
ADDPROPERTY(uRAR,"OpenMode",1)
ADDPROPERTY(uRAR,"OpenResult",0)
ADDPROPERTY(uRAR,"CmtBuf",'')
ADDPROPERTY(uRAR,"CmtBufSize",0)
ADDPROPERTY(uRAR,"CmtSize",0)
ADDPROPERTY(uRAR,"CmtState",0)

uRAR.ArcName = "c:\fichero.rar"
uRAR.CmtBuf = Space(16384)
uRAR.CmtBufSize = 16384
uRAR.OpenMode = 1

lHandle = RAROpenArchive(@uRAR)
NOTA: también he probado con un array en lugar de un objecto para uRAR

Gracias y espero que alguien me pueda ayudar.
Anders Altberg
2007-12-07 23:31:22 UTC
Permalink
El tipo de parametro es STRING y prubas enviar un objeto!

-Anders
Post by Petit78
Buenas a todos.
Estoy trabajando con VFP9 SP2 y para descomprimir fichero RAR estoy
utilizando la DLL que hay en http://www.winrar.es/descargas/fuentes de la
página oficial.
Mi problema es que al ejecutar la descompresión me da el error 9: data
type mismatch.
LOCAL lHandle As Long, uRar as object
uRAR= CREATEOBJECT("EMPTY")
ADDPROPERTY(uRAR,"ArcName",'')
ADDPROPERTY(uRAR,"OpenMode",1)
ADDPROPERTY(uRAR,"OpenResult",0)
ADDPROPERTY(uRAR,"CmtBuf",'')
ADDPROPERTY(uRAR,"CmtBufSize",0)
ADDPROPERTY(uRAR,"CmtSize",0)
ADDPROPERTY(uRAR,"CmtState",0)
uRAR.ArcName = "c:\fichero.rar"
uRAR.CmtBuf = Space(16384)
uRAR.CmtBufSize = 16384
uRAR.OpenMode = 1
NOTA: también he probado con un array en lugar de un objecto para uRAR
Gracias y espero que alguien me pueda ayudar.
Petit78
2007-12-08 16:27:33 UTC
Permalink
Gracias he probado con lo que me comentas y por mis conocimientos aunque
es un string internamente no deja
de ser una estructura definida en el archivo de inclusión como:
struct RAROpenArchiveData
{
char *ArcName;
unsigned int OpenMode;
unsigned int OpenResult;
char *CmtBuf;
unsigned int CmtBufSize;
unsigned int CmtSize;
unsigned int CmtState;
};

he probado con:

Declare LONG RAROpenArchive IN unrar.dll STRING@ ArchiveData

LOCAL lHandle As Long, uRar[7] as string

uRar[1]= "c:\fichero.rar"
uRar[2]= 1
uRar[3]= 0
uRar[4]= Space(16384)
uRar[5]= 16384
uRar[6]= 0
uRar[7]= 0

lHandle = RAROpenArchive(@uRAR)

y continua sin funcionar aunque el error actual es
Error 2027: Declare DLL call caused an exception.

Alguna otra sugerencia.

PD.: Si es tema es que espera un string y se le tiene que pasar
todos los parámetros concatenados que separador de campo tendría
que utilizar?

Grácias a todos de nuevo.
Post by Anders Altberg
El tipo de parametro es STRING y prubas enviar un objeto!
-Anders
Post by Petit78
Buenas a todos.
Estoy trabajando con VFP9 SP2 y para descomprimir fichero RAR estoy
utilizando la DLL que hay en http://www.winrar.es/descargas/fuentes de la
página oficial.
Mi problema es que al ejecutar la descompresión me da el error 9: data
type mismatch.
LOCAL lHandle As Long, uRar as object
uRAR= CREATEOBJECT("EMPTY")
ADDPROPERTY(uRAR,"ArcName",'')
ADDPROPERTY(uRAR,"OpenMode",1)
ADDPROPERTY(uRAR,"OpenResult",0)
ADDPROPERTY(uRAR,"CmtBuf",'')
ADDPROPERTY(uRAR,"CmtBufSize",0)
ADDPROPERTY(uRAR,"CmtSize",0)
ADDPROPERTY(uRAR,"CmtState",0)
uRAR.ArcName = "c:\fichero.rar"
uRAR.CmtBuf = Space(16384)
uRAR.CmtBufSize = 16384
uRAR.OpenMode = 1
NOTA: también he probado con un array en lugar de un objecto para uRAR
Gracias y espero que alguien me pueda ayudar.
Anders Altberg
2007-12-10 17:33:07 UTC
Permalink
Puedes servirte de la clase Struct de Christof Wollenhaupt
ftp://ftp.prolib.de/public/vfp/struct.zip

-Anders

"Petit78" <***@hotmail.com> wrote in message news:***@TK2MSFTNGP04.phx.gbl...
Gracias he probado con lo que me comentas y por mis conocimientos aunque es un string internamente no deja
de ser una estructura definida en el archivo de inclusión como:
struct RAROpenArchiveData
{
char *ArcName;
unsigned int OpenMode;
unsigned int OpenResult;
char *CmtBuf;
unsigned int CmtBufSize;
unsigned int CmtSize;
unsigned int CmtState;
};

he probado con:

Declare LONG RAROpenArchive IN unrar.dll STRING@ ArchiveData

LOCAL lHandle As Long, uRar[7] as string

uRar[1]= "c:\fichero.rar"
uRar[2]= 1
uRar[3]= 0
uRar[4]= Space(16384)
uRar[5]= 16384
uRar[6]= 0
uRar[7]= 0

lHandle = RAROpenArchive(@uRAR)

y continua sin funcionar aunque el error actual es
Error 2027: Declare DLL call caused an exception.

Alguna otra sugerencia.

PD.: Si es tema es que espera un string y se le tiene que pasar
todos los parámetros concatenados que separador de campo tendría
que utilizar?

Grácias a todos de nuevo.
En/na Anders Altberg ha escrit:
El tipo de parametro es STRING y prubas enviar un objeto!

-Anders

"Petit78" <***@hotmail.com> wrote in message news:***@TK2MSFTNGP06.phx.gbl...
Buenas a todos.
Estoy trabajando con VFP9 SP2 y para descomprimir fichero RAR estoy
utilizando la DLL que hay en http://www.winrar.es/descargas/fuentes de la
página oficial.
Mi problema es que al ejecutar la descompresión me da el error 9: data
type mismatch.

El código utilizado es:

Declare LONG RAROpenArchive IN unrar.dll STRING@ ArchiveData

LOCAL lHandle As Long, uRar as object

uRAR= CREATEOBJECT("EMPTY")
ADDPROPERTY(uRAR,"ArcName",'')
ADDPROPERTY(uRAR,"OpenMode",1)
ADDPROPERTY(uRAR,"OpenResult",0)
ADDPROPERTY(uRAR,"CmtBuf",'')
ADDPROPERTY(uRAR,"CmtBufSize",0)
ADDPROPERTY(uRAR,"CmtSize",0)
ADDPROPERTY(uRAR,"CmtState",0)

uRAR.ArcName = "c:\fichero.rar"
uRAR.CmtBuf = Space(16384)
uRAR.CmtBufSize = 16384
uRAR.OpenMode = 1

lHandle = RAROpenArchive(@uRAR)
NOTA: también he probado con un array en lugar de un objecto para uRAR

Gracias y espero que alguien me pueda ayudar.
Gabriel Camargo
2007-12-10 19:50:01 UTC
Permalink
Yo utilizo la linea de comandos de winrar.

vShell=createobject("wscript.shell")
vcad='"'+vrutawinrar+'" x -pclave "'+varchivorar+'" "'+vdirectorioextract+'."'
vshell.Run(vcad,4,.t.)

Para saber donde esta intalado winrar leo el registro con RegOpenKeyEx y
RegQueryValueEx.
Aparece la ventanita del winrar indicando el porcentaje de avance de
extraccion, pero eso a mi no me molesta.
Carlos Alloatti
2007-12-11 17:06:21 UTC
Permalink
Post by Petit78
Buenas a todos.
Estoy trabajando con VFP9 SP2 y para descomprimir fichero RAR estoy
utilizando la DLL que hay enhttp://www.winrar.es/descargas/fuentesde
la página oficial.
Mi problema es que al ejecutar la descompresión me da el error 9: data
type mismatch.
LOCAL lHandle As Long, uRar as object
uRAR= CREATEOBJECT("EMPTY")
ADDPROPERTY(uRAR,"ArcName",'')
ADDPROPERTY(uRAR,"OpenMode",1)
ADDPROPERTY(uRAR,"OpenResult",0)
ADDPROPERTY(uRAR,"CmtBuf",'')
ADDPROPERTY(uRAR,"CmtBufSize",0)
ADDPROPERTY(uRAR,"CmtSize",0)
ADDPROPERTY(uRAR,"CmtState",0)
uRAR.ArcName = "c:\fichero.rar"
uRAR.CmtBuf = Space(16384)
uRAR.CmtBufSize = 16384
uRAR.OpenMode = 1
NOTA: también he probado con un array en lugar de un objecto para uRAR
Gracias y espero que alguien me pueda ayudar.
El tema es que ArchiveData es una estructura C, y como en Fox no
existen las estructuras, debes crearla manualmente y pasarla como una
cadena. Para esto se puede utilizar una clase, pero te muestro el
concepto basico en este caso, continuando tu codigo:

La operacion básica es convertir los valores numericos a caracter, o
mejor dicho a la representacion del valor numerico en memoria, que son
4 bytes o 32 bits, para eso usamos bintoc

*struct RAROpenArchiveData
* char *ArcName;
* UINT OpenMode;
* UINT OpenResult;
* char *CmtBuf;
* UINT CmtBufSize;
* UINT CmtSize;
* UINT CmtState;


With uRAR
m.lcArchiveData = .ArcName + chr(0) + bintoc(.OpenMode, "4rs") +
bintoc(.OpenResult, "4rs") ;
+ .CmtBuf + bintoc(.CmtBufSize, "4rs") + bintoc(.CmtSize, "4rs") ;
+ bintoc(.CmtState, "4rs")

EndWith

* Debemos pasar una variable de memoria, no una propiedad de un
objeto!
m. lHandle = RAROpenArchive(@m.lcArchiveData)

*Ahora debes obtener los valores devueltos:
With uRAR
.OpenResult = ctobin(Substr(m.lcArchiveData, Len(.ArcName) + 1 + 4 +
1, 4), "4rs")
.CmtSize = ctobin(Substr(m.lcArchiveData, Len(.ArcName) + 1 + 4 + 4
+ .CmtBufSize + 4 + 1, 4), "4rs")
.CmtState = ctobin(right(m.lcArchiveData, 4), "4rs")
Endwith

Este código esta sin comprobar, pero te dara la idea.

Carlos Alloatti

Loading...