подскажите с распаковкой

Тема в разделе "WASM.WIN32", создана пользователем hawk, 8 ноя 2010.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Знаю , что тема достаточно избитая,но ответ на причину почему у меня не заработало я так и не нашёл.

    Запоковал архив и хочу распоковать используя библиотеку Unrar.dll

    Код (Text):
    1. #include "stdafx.h"
    2. #include <Windows.h>
    3. #include <math.h>
    4. #include <stdio.h>
    5.  
    6. struct RAROpenArchiveDataEx
    7. {
    8.     char         *ArcName;
    9.     wchar_t      *ArcNameW;
    10.     unsigned int OpenMode;
    11.     unsigned int OpenResult;
    12.     char         *CmtBuf;
    13.     unsigned int CmtBufSize;
    14.     unsigned int CmtSize;
    15.     unsigned int CmtState;
    16.     unsigned int Flags;
    17.     unsigned int Reserved[32];
    18. };
    19.  
    20. struct RARHeaderData
    21. {
    22.     char         ArcName[260];
    23.     char         FileName[260];
    24.     unsigned int Flags;
    25.     unsigned int PackSize;
    26.     unsigned int UnpSize;
    27.     unsigned int HostOS;
    28.     unsigned int FileCRC;
    29.     unsigned int FileTime;
    30.     unsigned int UnpVer;
    31.     unsigned int Method;
    32.     unsigned int FileAttr;
    33.     char         *CmtBuf;
    34.     unsigned int CmtBufSize;
    35.     unsigned int CmtSize;
    36.     unsigned int CmtState;
    37. };
    38.  
    39. #define RAR_OM_EXTRACT       1
    40. HANDLE OpenArchive(RAROpenArchiveDataEx *DAt,FARPROC A1)
    41. {
    42.  
    43.     HANDLE hArcData;
    44.     __asm
    45.     {
    46.         mov ecx,DAt
    47.         push ecx
    48.         mov eax,A1
    49.         call eax
    50.         mov hArcData,eax
    51.     }  
    52.     return hArcData;
    53. }
    54. int SetPassword(HANDLE HAND1,unsigned char *PASSWORD,FARPROC A2)
    55. {
    56.     int Rr;
    57.     __asm
    58.     {
    59.         mov ecx,PASSWORD
    60.         push ecx
    61.         push HAND1
    62.         mov eax,A2
    63.         call eax
    64.         mov Rr,eax
    65.     }
    66. return Rr;
    67. }
    68.  
    69. int check(RARHeaderData *HeaderData,HANDLE HAND1,FARPROC A3)
    70. {
    71.     int Rr;
    72.     __asm
    73.     {
    74.         mov eax,HeaderData
    75.         push eax
    76.         mov ecx,HAND1
    77.         push ecx
    78.         mov edx,A3
    79.         call edx
    80.         mov Rr,eax
    81.     }
    82. return Rr;
    83. }
    84. int checkPasFail(HANDLE HAND1,char *PATH,char *FileName,FARPROC A4)
    85. {
    86.     int Rr;
    87.     __asm
    88.     {
    89.         push 0h
    90.         mov eax,PATH
    91.         push eax
    92.         push 2h
    93.         mov eax,HAND1
    94.         push eax
    95.         mov eax,A4
    96.         call eax
    97.         mov Rr,eax
    98.     }
    99. return Rr;
    100. }
    101.  
    102.  
    103. int _tmain(int argc, _TCHAR* argv[])
    104. {
    105.     RAROpenArchiveDataEx OpenArchiveData;
    106.     ZeroMemory(&OpenArchiveData, sizeof(OpenArchiveData));
    107.     char *sCmtBuf=new char[16*1024];
    108.     memset(sCmtBuf,0,16*1024);
    109.     char *str=new char [100];
    110.     memset(str,0,100);
    111.     char NAME[]="C:\\1.rar";//имя архива
    112.     memcpy(str,NAME,strlen(NAME));
    113.     ////////////////////////////////////////////////////////////////////////////////////////////////////////
    114.     HMODULE UN=LoadLibraryA("C:\\unrar.dll");
    115.     FARPROC A1=GetProcAddress(UN,"RAROpenArchive");
    116.     FARPROC A2=GetProcAddress(UN,"RARSetPassword");
    117.     FARPROC A3=GetProcAddress(UN,"RARReadHeader");
    118.     FARPROC A4=GetProcAddress(UN,"RARProcessFile");
    119.     FARPROC A5=GetProcAddress(UN,"RARSetCallback");
    120.     FARPROC A7=GetProcAddress(UN,"RARCloseArchive");
    121.     FARPROC A9=GetProcAddress(UN,"RARSetCallback");
    122.     //////////////////////////////////////////////////////////////////////////////////////////////////////
    123.     RARHeaderData HeaderData;
    124.     ZeroMemory(&HeaderData, sizeof(RARHeaderData));
    125.     //////////////////////////////////////////////////////////////////////////////////////////////////////
    126.     HeaderData.CmtBuf = NULL;
    127.     OpenArchiveData.ArcName = str;
    128.     OpenArchiveData.CmtBuf  = sCmtBuf;
    129.     OpenArchiveData.CmtBufSize = sizeof(sCmtBuf);
    130.     OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
    131.     //////////////////////////////////////////////////////////////////////////////////////////////////////
    132.     HANDLE  hArcData;
    133.     int K=1;
    134.     hArcData=OpenArchive(&OpenArchiveData,A1);
    135. ///на этом этабе всё нормально
    136.     if(OpenArchiveData.OpenResult!=0){return 0;}
    137.     while(K!=0)
    138.     {
    139.         K=check(&HeaderData,hArcData,A3);
    140. //тут вроде тоже-выдаёт структуру в которой указывает имя запакованного файла и т.д.
    141.         checkPasFail(hArcData,NULL,NULL,A4);//но распоковки архива так и не происходит
    142.  
    143.     }
    144.     return 0;
    145. }
    Собственно распаковка архива так и не происходит.
    На сколько я понял , если в качестве имени и пути для извлечения функции GetProcAddress передать 0h то распоковка происходит в туже директорию в которой лежит архив.
    Собственно вся последовательность использования функции из unrar.dll у меня выглядит так:

    RAROpenArchive
    RARReadHeader
    RARProcessFile-вот он мне всегда возвращает 0,но ничего не распоковываеться.

    Если кто работал с Unrar.dll пожалуйста подскажите где у меня тут ошибка.
    Заранее благодарен.
     
  2. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    Зачем школу прогуливал?
     
  3. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    newbie
    не понял вашей мвсли.
    Если можно поподробней.
    Так кто нибудь в курсе?
     
  4. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    что за икс+игрик+й+ν вы написали :)
    http://www.realcoding.net/articles/klass-dlya-ispolzovaniya-biblioteki-unrardll.html
     
  5. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    посмотрев по данной ссылке можно увидеть что я делаю тоже самое только без RARSetCallback(hArcData, CallBackProc, (LONG)sPass);

    ........................
    код из указанного вами
    Код (Text):
    1.   ZeroMemory(&OpenArchiveData, sizeof(OpenArchiveData));
    2.             OpenArchiveData.ArcName = str;
    3.             OpenArchiveData.CmtBuf  = sCmtBuf;
    4.             OpenArchiveData.CmtBufSize = sizeof(sCmtBuf);
    5.             OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
    6.             hArcData = RAROpenArchiveEx(&OpenArchiveData);.
    7. ,..................................
    мой код:
    Код (Text):
    1.  HeaderData.CmtBuf = NULL;
    2.     OpenArchiveData.ArcName = str;
    3.     OpenArchiveData.CmtBuf  = sCmtBuf;
    4.     OpenArchiveData.CmtBufSize = sizeof(sCmtBuf);
    5.     OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
    6.     //////////////////////////////////////////////////////////////////////////////////////////////////////
    7.     HANDLE  hArcData;
    8.     int K=1;
    9.     hArcData=OpenArchive(&OpenArchiveData,A1);
    Код (Text):
    1. код из указанного вами
    2.             if( !OpenArchiveData.OpenResult )
    3.             {
    4.                 // передаем параметром в Callback пароль
    5.                 RARSetCallback(hArcData, CallBackProc, (LONG)sPass);
    6.                 HeaderData.CmtBuf = NULL;
    7.  
    8.                 while( (RHCode = RARReadHeader(hArcData, &HeaderData)) == 0 )
    9.                 {
    10.                     PFCode = RARProcessFile(hArcData, RAR_EXTRACT, m_sOutDir, NULL);
    11.                     if(PFCode)
    12.                         break;
    13.                 }
    мой код:

    Код (Text):
    1.     if(OpenArchiveData.OpenResult!=0){return 0;}
    2.     while(K!=0)
    3.     {
    4.         K=check(&HeaderData,hArcData,A3);//RARReadHeader
    5. //тут вроде тоже-выдаёт структуру в которой указывает имя запакованного файла и т.д.
    6.         checkPasFail(hArcData,NULL,NULL,A4);//RARProcessFile но распоковки архива так и не происходит
    7.  
    8.     }
    что то я не особо вижу разницу за исключением RARSetCallback.....
    Если Вы видите то подскажите пожалуйста.
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    RAROpenArchive -> RARSetPassword -> RARReadHeader -> (RARProcessFile в цикле, пока RARReadHeader!=0) ->RARCloseArchive
    Если RARReadHeader=ERAR_BAD_DATA =>ошибка

    Врт пример на VB
    Код (Text):
    1. Public Sub RARExecute(RarFile As String, EndFil As String, Optional Password As String = "")
    2.     Dim lHandle As Long
    3.     Dim iStatus As Integer
    4.     Dim uRAR As RAROpenArchiveData
    5.     Dim uHeader As RARHeaderData
    6.      
    7.     uRAR.ArcName = RarFile
    8.     uRAR.CmtBuf = Space(16384)
    9.     uRAR.CmtBufSize = 16384
    10.    
    11.     uRAR.OpenMode = RAR_OM_EXTRACT
    12.     lHandle = RAROpenArchive(uRAR)
    13.     If uRAR.OpenResult <> 0 Then MsgBox "Archive not found!", vbCritical, "Error!": End
    14.  
    15.     If Password <> "" Then RARSetPassword lHandle, Password
    16.    
    17.     If (uRAR.CmtState = 1) Then MsgBox uRAR.CmtBuf, vbInformation, "Comment"
    18.    
    19.     iStatus = RARReadHeader(lHandle, uHeader)
    20.     Do Until iStatus <> 0
    21.         RARProcessFile lHandle, RAR_EXTRACT, EndFil, ""
    22.         Timeout 5&
    23.         iStatus = RARReadHeader(lHandle, uHeader)
    24.     Loop
    25.    
    26.     If iStatus <> ERAR_BAD_DATA Then RARCloseArchive lHandle: Exit Sub
    27.     MsgBox "Error Password!", vbCritical, "Error!": End
    28. End Sub
     
  7. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    обьявите нормально прототипы функций, уберите эти ужасные асм вставки, которые взрывают голову и в которых скорее всего ошибка.
     
  8. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Спасибо за совет.
    Объявил через прототипы чуть подправил и всё заработало.
    Ещё раз спасибо.