Bonjour,
Voila, j'essaye d'adapter lzma SDK/7zip, http://files.first-world.info/temp/7zip.zip et dés que je met #include <QObject> dans 7zMain.c j'ai prés de 600 erreurs, quelqu'un serai me dire pourquoi?
Merci.
Version imprimable
Bonjour,
Voila, j'essaye d'adapter lzma SDK/7zip, http://files.first-world.info/temp/7zip.zip et dés que je met #include <QObject> dans 7zMain.c j'ai prés de 600 erreurs, quelqu'un serai me dire pourquoi?
Merci.
Salut,
7zMain.c => C
Qt => C++
Qt utilise des concepts que le C ne connaît que de très loin (les classes en sont le meilleur et le plus simple exemple). QObject commence en définissant une classe, ça tombe mal.
Ensuite, il faut que ton fichier passe bien par le moc. Or, avec son extension, il y a très peu de chances qu'un outil automatique puisse le comprendre.
Finalement, la manière. Très personnellement, dans ce genre de cas, je préfère dériver de QIODevice. Au lieu d'aller magouiller je-ne-sais-quoi dans un fichier du SDK, je crée, dans mon propre fichier, un dérivé de QIODevice, qui appelle les fonctions du SDK au bon moment.
Je pense étre incapable de faire ça, je vais essayer quand même...
La version C++ n'as rien à voir avec la version C, c'est soit juste le décompateur lzma, ou tout la gui windows.
J'ai besoin de pouvoir extraire, vérifié, lire une archive multi-fichiers supportant le lzma, soit 7z par exemple.
Si tu peux gérer l'archive dès le départ, je dirais de faire d'abord un .tar des fichiers, puis de le passer à LZMA. Pour la décompression, chemin inverse. Pour simplifier la gestion du .tar, un petit coup de QProcess.
Sinon... Il faudrait aller un peu plus en profondeur dans les formats des archives, et je n'ai pas de clé pour t'aider.
Si tu y arrives, fais-nous signe (même si c'est une piste pour lire les formats ou un truc du genre).
J'ai la méthodologie pour y arrivé, j'ai fait un code, mais il me retourne le code SZ_ERROR_DATA:
J'ai du mal à comprendre les 2 derniers éléments de la fonction LzmaUncompress() qui ne sont pas documenté bien sur....Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File")); if(fileName!="") { QFile temp(fileName); if(temp.open(QIODevice::ReadOnly)) { QByteArray srcFile; srcFile=temp.readAll(); unsigned char *dest; size_t * dest_length=new size_t; const unsigned char * src = (const unsigned char *) srcFile.constData(); SizeT * src_lenght = new SizeT; *src_lenght = srcFile.size(); ui->labelSizeSource->setText(QString::number(srcFile.size())); int ret; ret = LzmaUncompress(dest, dest_length, src, src_lenght, src, LZMA_PROPS_SIZE); if(ret == SZ_OK) { ui->labelSizeDest->setText(QString::number(*dest_length)); //return SZ_OK; } else { ui->label_2->setText("error: "); ui->labelSizeDest->setText(QString::number(ret)); //return ret; } temp.close(); } }
Normalement, il ne sert à rien de les comprendre. Prends leurs valeurs par défaut indiquées dans la doc, ça ira parfaitement, normalement. Concernant l'avant-dernier paramètre, j'avais lu, je ne sais plus où, qu'il fallait mettre src+1, et non src.
Sinon, il me semble que le problème est plus LZMA-related, et non plus Qt-.
Voila un code qui ne crash pas sous gcc, c'est déjà un début:
Hors LzmaUncompress(); retourne toujours 1 et je ne comprends pas ce que doit contenir le 5eme paramétre.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 QByteArray data=temp.readAll(); unsigned char dest[1024*1024]; size_t dest_length = 1024*1024; const unsigned char * src = (const unsigned char *) data.constData(); SizeT src_lenght = data.size(); int ret=999999; int a = 0; while(a <15 && ret != SZ_OK) { ret = LzmaUncompress(dest, &dest_length, src, &src_lenght, src + a, LZMA_PROPS_SIZE); a++; } if(ret == SZ_OK) { data = (const char *) dest; ui->label_2->setText("Ok: "); //return SZ_OK; } else { ui->label_2->setText("Error"); //return ret; }
Tester avec un vrai fichier lzma ayant cette entéte:
Code:5d00000002006205000000000000218bbc1ba78c3406ac7a7a8