Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Error al llamar la funció CreateZip de ZipUtils

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Error al llamar la funció CreateZip de ZipUtils Responder citando

Hola Buenas tardes.
Estoy migrando una aplicación que tenía con C++Builder4 a C++Rad Studio Rio 10.3.
En builder4 tenía esta función para comprimir y me funcionaba perfectmente:

void __fastcall ComprimeArchivo(AnsiString sArchivoAcomprimir, AnsiString sNomArchivoZip)
{
AnsiString sArchivo, sArchivoZip;

//sArchivoSinExtension= ChangeFileExt(sArchivoAcomprimir,"");
sArchivo= ExtractFileName(sArchivoAcomprimir);
sArchivoZip = sArchivo + ".zip";

if(sNomArchivoZip.Length() >0)
sArchivoZip=sNomArchivoZip;

// Crea el fichero zip
HZIP hz;
hz = CreateZip(sArchivoZip.c_str(), 0);//,ZIP_FILENAME);
ZipAdd(hz,sArchivo.c_str(),sArchivo.c_str());//,ZIP_FILENAME);

CloseZip(hz);
}
//---------------------------------------------------------------------------

Y ahora al compilarla en C++Rad Studio Rio me da el siguiente error:

[bcc32c Error] fteFunciones.cpp(350): no matching function for call to 'CreateZip'
zip.h(33): candidate function not viable: no known conversion from 'char *' to 'const TCHAR *' (aka 'const wchar_t *') for 1st argument

y sí se lo estoy pasando como wchar_t --> sArchivo.c_str()

Alguien me puede ayudar. Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, prueba cambiando todas las ocurrencias de "AnsiString" por "String".

Supongo que estas usando alguna librería de terceros. Desde C++Builder XE2 en adelante viene incluida de fabrica la clase TZipFile que quizás te sea útil. No es tan completa como muchas librerías de terceros, pero para cosas básicas es suficiente. Un ejemplo de uso:

Código:
//Añadimos: #include<System.Zip.hpp> y #include<memory>
std::unique_ptr<TZipFile> Zip(new TZipFile);
Zip->Open(sNomArchivoZip, zmWrite);
Zip->Add(sArchivoAcomprimir);


Si estas migrando desde una versión de C++Builder tan vieja te recomiendo que le eches un vistazo a estos enlaces sobre UNICODE:

[C++Builder and Unicode]
https://community.embarcadero.com/blogs/entry/cbuilder-and-unicode-43342

[Migrating your C++Builder Projects to Unicode]
https://www.youtube.com/watch?v=QgSiQiE8lKg

[Migración de proyectos C++ Builder a Unicode]
https://www.youtube.com/watch?v=W518DbJa5R4

[Understanding String Types in C++Builder]
https://www.youtube.com/watch?v=gd3p79IcSzQ

[WinAPI: Being Unicode Friendly]
http://www.cplusplus.com/articles/2w6AC542/
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas Gracias Leo. Impeclable como siempre.

También le echaré un vista a la calse TZipFile.

He cambiado todas las referencias de AnsiString por String y además utilizar PChar. La función ha quedado así:

//---------------------------------------------------------------------------
void __fastcall ComprimeArchivo(String sArchivoAcomprimir, String sNomArchivoZip)
{
String sArchivo, sArchivoZip;

//sArchivoSinExtension= ChangeFileExt(sArchivoAcomprimir,"");
sArchivo= ExtractFileName(sArchivoAcomprimir);
sArchivoZip = sArchivo + ".zip";

if(sNomArchivoZip.Length() >0)
sArchivoZip=sNomArchivoZip;

// Crea el fichero zip
HZIP hz;
hz = CreateZip( PChar( sArchivoZip.c_str() ), 0);
ZipAdd( hz, PChar(sArchivo.c_str()), PChar(sArchivo.c_str()) ,0);//,ZIP_FILENAME);

CloseZip(hz);
}
//---------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

No debería ser necesario usar PChar, ya que cuando tienes en las propiedades del proyecto (C++ Shared Options > _TCHAR maps to) con "wchar_t", String se convierte en UnicodeString y cuando lo tienes como "char" se convierte en AnsiString (es un typedef condicional), y su miembro "c_str()" a wchar_t* o char* según corresponda.

Si es la librería de terceros que supongo, tiene versión Unicode de las funciones, están declaradas como TCHAR que usan una versión u otra automáticamente..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Efectivamente Leo.

Así queda finalmente.

//---------------------------------------------------------------------------
void __fastcall ComprimeArchivo(String sArchivoAcomprimir, String sNomArchivoZip)
{
String sArchivo, sArchivoZip;

//sArchivoSinExtension= ChangeFileExt(sArchivoAcomprimir,"");
sArchivo= ExtractFileName(sArchivoAcomprimir);
sArchivoZip = sArchivo + ".zip";

if(sNomArchivoZip.Length() >0)
sArchivoZip=sNomArchivoZip;

// Crea el fichero zip
HZIP hz;
hz = CreateZip( sArchivoZip.t_str() , 0 );
ZipAdd( hz, sArchivo.t_str(), sArchivo.t_str() );

CloseZip(hz);
}
//---------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.