Menu

7z,dll + *.rar, *.cab, *.arj etc.

yogich_by
2011-05-08
2012-12-07
  • yogich_by

    yogich_by - 2011-05-08

    Hello!
    I can not understand: Why is the "CreateObject" (7z.dll) does not return "S_OK" when I call it a

    GUID = 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x03, 0x00, 0x00
    

    , eg ? With other parameters - does not work either. Successfully works only with CLSID_CFormat7z.
    I want to learn how to use 7z. dll files to other formats.
    Thank you.

     
  • yogich_by

    yogich_by - 2011-05-08

    Вроде бы как разобрался. Извините, что пишу по-русски - на этом языке я более дельно изъясняю свои мысли :)

    Ответ крылся в файлике ArchiveExports.cpp из проекта Format7zF. В описании функции CreateArchiver, которая вызывается из функции CreateObject, есть такое место (добавил свои комментарии):

    STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)
    {
      COM_TRY_BEGIN
      {
        int needIn = (*iid == IID_IInArchive);
        int needOut = (*iid == IID_IOutArchive);
        if (!needIn && !needOut)
          return E_NOINTERFACE;
    // Производится поиск по пятому байту структуры типа архива
        int formatIndex = FindFormatCalssId(clsid);
        if (formatIndex < 0)
          return CLASS_E_CLASSNOTAVAILABLE;
    // создается элемент структуры CArcInfo для типа требуемого архива  
        const CArcInfo &arc = *g_Arcs[formatIndex];
        if (needIn)
        {
          *outObject = arc.CreateInArchive();
          ((IInArchive *)*outObject)->AddRef();
        }
        else
        {
          if (![b]arc.CreateOutArchive[/b])
    // Вот здесь мне возвращалась ошибка - так как для некоторых форматов нет поддержки упаковки в архив
            return CLASS_E_CLASSNOTAVAILABLE;
          *outObject = arc.CreateOutArchive();
          ((IOutArchive *)*outObject)->AddRef();
        }
      }
      COM_TRY_END
      return S_OK;
    }
    

    Последний комментарий сделал на основании следующего:
    например, в файле 7zRegister.cpp видим:

    static CArcInfo g_ArcInfo =
    { L"tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, [b]CreateArcOut [/b]};
    

    Аналогично и, например, для Zip (ZipRegister.cpp)

    static CArcInfo g_ArcInfo =
      { L"zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, [b]CreateArcOut [/b]};
    

    А для Rar (RarRegister.cpp)

    static CArcInfo g_ArcInfo =
      { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, [b]0[/b],  };
    

    Печально. Получается, что 7z.dll поддерживает архивацию не во все форматы. А в какой тогда формат упаковывает консольная программа 7z.exe, если указать формат *.rar?

    В любом случае спасибо за прекрасную работу - работать с исходниками доставляет удовольствие!

     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.