Работа с zip средствами WinAPI

Тема в разделе "WASM.BEGINNERS", создана пользователем SmanxX1, 21 окт 2008.

  1. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    Собственно, как запаковывать/распаковывать zip архивы винапишными функциями(и есть ли вообще таковые)?
    Я не уверен, но венда вроде еще умеет саомстоятельно работать с cab архивами, если да, то как распаковывать такие архивы?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Для cab файлов
    http://msdn.microsoft.com/en-us/library/aa377404(VS.85).aspx
    насчет зипа можно покопать zipfldr.dll
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    для zip:
    LZOpenFile, LZClose, LZInit, LZRead
    но только распаковка.
     
  4. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    спс
    Я уже копал.
    Экспортируемые функции:
    Код (Text):
    1. RouteTheCall
    2. DllCanUnloadNow
    3. DllGetClassObject
    4. DllRegisterServer
    5. DllUnregisterServer
    6. RegisterSendto
    Что-то непонятное... Дальше не стал копать.

    Да мне только распаковка и нужна. Спасибо.
    Хотя вроде и запаковка есть(нашел LZCreateFileW), ведь венда умеет как-то создавать зжатые zip-папки. ;)
     
  5. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Ну умеет она только с XP и весь функционал реализован в zipfldr.dll
    Разве LZ == zip?
    этот код
    Код (Text):
    1. nt _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     if (argc > 2)
    4.     {
    5.             OFSTRUCT ofs_in  = {0};
    6.             OFSTRUCT ofs_out = {0};
    7.             INT hSrcFile = 0, hDstFile = 0;
    8.             DWORD ec = 0;
    9.  
    10.             hSrcFile = LZOpenFile(argv[1], &ofs_in, OF_READ);
    11.             ec = GetLastError();
    12.             if (hSrcFile >= 0)
    13.             {
    14.                 hDstFile = LZOpenFile(argv[2], &ofs_out, OF_WRITE);
    15.                 ec = GetLastError();
    16.                 if(hDstFile >= 0)
    17.                 {
    18.                     ec = LZCopy(hDstFile, hSrcFile);
    19.                     switch(ec)
    20.                     {
    21.                         case LZERROR_BADINHANDLE: printf("The handle identifying the source file is not valid. The file cannot be read.\n");
    22.                             break;
    23.                         case LZERROR_BADOUTHANDLE: printf("The handle identifying the destination file is not valid. The file cannot be written.\n");
    24.                             break;
    25.                         case LZERROR_GLOBALLOC: printf("The maximum number of open compressed files has been exceeded or local memory cannot be allocated.\n");
    26.                             break;
    27.                         case LZERROR_GLOBLOCK: printf("The LZ file handle cannot be locked down.\n");
    28.                             break;
    29.                         case LZERROR_READ: printf("The source file format is not valid.\n");
    30.                             break;
    31.                         default:
    32.                             printf("ec = %X\n", ec);
    33.                     }
    34.                     LZClose(hDstFile);
    35.                 }
    36.                 LZClose(hSrcFile);
    37.             }
    38.     }
    39. }
    говорит The handle identifying the source file is not valid. The file cannot be read. если натравливать его на zip файл созданый раром(при создании средствами винды тоже самое)
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    nobodyzzz
    надо создавать с помощью compress.exe (в ранних версиях винды и\или в продуктах борланада было) и это ес-но совсем не зип и совсем не архиватор, обычный компрессор.
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    censored
    это понятно =) но человек спрашивал про zip-файлы
    я не много накосячил вместо
    Код (Text):
    1. ec = LZCopy(hDstFile, hSrcFile);
    надо
    Код (Text):
    1. ec = LZCopy(hSrcFile, hDstFile);
    Но сути это не меняет =) - выполняется без ошибок, но ничего не распаковывает(для zip файлов, для файлов созданных compress.exe все работает отлично)
     
  8. shizo

    shizo New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2008
    Сообщения:
    6
  9. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Не имеет отношения к ZIP. Это старый (Win16) алго/формат инсталляционных файлов.
    Для ZIP лучше всего поискать MFC реализацию ZLib (линка нет под рукой) - хорошо работает с большими файлами. Оригинальная - полное дерьмо.
     
  10. BLiTZ

    BLiTZ Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    54
    Дык это ж COM, батенька... Посмотреть например можно тут + гугль...
     
  11. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    покопался немного в zipfldr.dll =)) вот код распаковки zip файла средствами zipfldr.dll
    http://nopaste.info/86c2de80d8.html
     
  12. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    Спасибо, но уже не нужно.
    Может другим пригодиться. ;)