Знаю , что тема достаточно избитая,но ответ на причину почему у меня не заработало я так и не нашёл. Запоковал архив и хочу распоковать используя библиотеку Unrar.dll Код (Text): #include "stdafx.h" #include <Windows.h> #include <math.h> #include <stdio.h> struct RAROpenArchiveDataEx { char *ArcName; wchar_t *ArcNameW; unsigned int OpenMode; unsigned int OpenResult; char *CmtBuf; unsigned int CmtBufSize; unsigned int CmtSize; unsigned int CmtState; unsigned int Flags; unsigned int Reserved[32]; }; struct RARHeaderData { char ArcName[260]; char FileName[260]; unsigned int Flags; unsigned int PackSize; unsigned int UnpSize; unsigned int HostOS; unsigned int FileCRC; unsigned int FileTime; unsigned int UnpVer; unsigned int Method; unsigned int FileAttr; char *CmtBuf; unsigned int CmtBufSize; unsigned int CmtSize; unsigned int CmtState; }; #define RAR_OM_EXTRACT 1 HANDLE OpenArchive(RAROpenArchiveDataEx *DAt,FARPROC A1) { HANDLE hArcData; __asm { mov ecx,DAt push ecx mov eax,A1 call eax mov hArcData,eax } return hArcData; } int SetPassword(HANDLE HAND1,unsigned char *PASSWORD,FARPROC A2) { int Rr; __asm { mov ecx,PASSWORD push ecx push HAND1 mov eax,A2 call eax mov Rr,eax } return Rr; } int check(RARHeaderData *HeaderData,HANDLE HAND1,FARPROC A3) { int Rr; __asm { mov eax,HeaderData push eax mov ecx,HAND1 push ecx mov edx,A3 call edx mov Rr,eax } return Rr; } int checkPasFail(HANDLE HAND1,char *PATH,char *FileName,FARPROC A4) { int Rr; __asm { push 0h mov eax,PATH push eax push 2h mov eax,HAND1 push eax mov eax,A4 call eax mov Rr,eax } return Rr; } int _tmain(int argc, _TCHAR* argv[]) { RAROpenArchiveDataEx OpenArchiveData; ZeroMemory(&OpenArchiveData, sizeof(OpenArchiveData)); char *sCmtBuf=new char[16*1024]; memset(sCmtBuf,0,16*1024); char *str=new char [100]; memset(str,0,100); char NAME[]="C:\\1.rar";//имя архива memcpy(str,NAME,strlen(NAME)); //////////////////////////////////////////////////////////////////////////////////////////////////////// HMODULE UN=LoadLibraryA("C:\\unrar.dll"); FARPROC A1=GetProcAddress(UN,"RAROpenArchive"); FARPROC A2=GetProcAddress(UN,"RARSetPassword"); FARPROC A3=GetProcAddress(UN,"RARReadHeader"); FARPROC A4=GetProcAddress(UN,"RARProcessFile"); FARPROC A5=GetProcAddress(UN,"RARSetCallback"); FARPROC A7=GetProcAddress(UN,"RARCloseArchive"); FARPROC A9=GetProcAddress(UN,"RARSetCallback"); ////////////////////////////////////////////////////////////////////////////////////////////////////// RARHeaderData HeaderData; ZeroMemory(&HeaderData, sizeof(RARHeaderData)); ////////////////////////////////////////////////////////////////////////////////////////////////////// HeaderData.CmtBuf = NULL; OpenArchiveData.ArcName = str; OpenArchiveData.CmtBuf = sCmtBuf; OpenArchiveData.CmtBufSize = sizeof(sCmtBuf); OpenArchiveData.OpenMode = RAR_OM_EXTRACT; ////////////////////////////////////////////////////////////////////////////////////////////////////// HANDLE hArcData; int K=1; hArcData=OpenArchive(&OpenArchiveData,A1); ///на этом этабе всё нормально if(OpenArchiveData.OpenResult!=0){return 0;} while(K!=0) { K=check(&HeaderData,hArcData,A3); //тут вроде тоже-выдаёт структуру в которой указывает имя запакованного файла и т.д. checkPasFail(hArcData,NULL,NULL,A4);//но распоковки архива так и не происходит } return 0; } Собственно распаковка архива так и не происходит. На сколько я понял , если в качестве имени и пути для извлечения функции GetProcAddress передать 0h то распоковка происходит в туже директорию в которой лежит архив. Собственно вся последовательность использования функции из unrar.dll у меня выглядит так: RAROpenArchive RARReadHeader RARProcessFile-вот он мне всегда возвращает 0,но ничего не распоковываеться. Если кто работал с Unrar.dll пожалуйста подскажите где у меня тут ошибка. Заранее благодарен.
что за икс+игрик+й+ν вы написали http://www.realcoding.net/articles/klass-dlya-ispolzovaniya-biblioteki-unrardll.html
посмотрев по данной ссылке можно увидеть что я делаю тоже самое только без RARSetCallback(hArcData, CallBackProc, (LONG)sPass); ........................ код из указанного вами Код (Text): ZeroMemory(&OpenArchiveData, sizeof(OpenArchiveData)); OpenArchiveData.ArcName = str; OpenArchiveData.CmtBuf = sCmtBuf; OpenArchiveData.CmtBufSize = sizeof(sCmtBuf); OpenArchiveData.OpenMode = RAR_OM_EXTRACT; hArcData = RAROpenArchiveEx(&OpenArchiveData);. ,.................................. мой код: Код (Text): HeaderData.CmtBuf = NULL; OpenArchiveData.ArcName = str; OpenArchiveData.CmtBuf = sCmtBuf; OpenArchiveData.CmtBufSize = sizeof(sCmtBuf); OpenArchiveData.OpenMode = RAR_OM_EXTRACT; ////////////////////////////////////////////////////////////////////////////////////////////////////// HANDLE hArcData; int K=1; hArcData=OpenArchive(&OpenArchiveData,A1); Код (Text): код из указанного вами if( !OpenArchiveData.OpenResult ) { // передаем параметром в Callback пароль RARSetCallback(hArcData, CallBackProc, (LONG)sPass); HeaderData.CmtBuf = NULL; while( (RHCode = RARReadHeader(hArcData, &HeaderData)) == 0 ) { PFCode = RARProcessFile(hArcData, RAR_EXTRACT, m_sOutDir, NULL); if(PFCode) break; } мой код: Код (Text): if(OpenArchiveData.OpenResult!=0){return 0;} while(K!=0) { K=check(&HeaderData,hArcData,A3);//RARReadHeader //тут вроде тоже-выдаёт структуру в которой указывает имя запакованного файла и т.д. checkPasFail(hArcData,NULL,NULL,A4);//RARProcessFile но распоковки архива так и не происходит } что то я не особо вижу разницу за исключением RARSetCallback..... Если Вы видите то подскажите пожалуйста.
RAROpenArchive -> RARSetPassword -> RARReadHeader -> (RARProcessFile в цикле, пока RARReadHeader!=0) ->RARCloseArchive Если RARReadHeader=ERAR_BAD_DATA =>ошибка Врт пример на VB Код (Text): Public Sub RARExecute(RarFile As String, EndFil As String, Optional Password As String = "") Dim lHandle As Long Dim iStatus As Integer Dim uRAR As RAROpenArchiveData Dim uHeader As RARHeaderData uRAR.ArcName = RarFile uRAR.CmtBuf = Space(16384) uRAR.CmtBufSize = 16384 uRAR.OpenMode = RAR_OM_EXTRACT lHandle = RAROpenArchive(uRAR) If uRAR.OpenResult <> 0 Then MsgBox "Archive not found!", vbCritical, "Error!": End If Password <> "" Then RARSetPassword lHandle, Password If (uRAR.CmtState = 1) Then MsgBox uRAR.CmtBuf, vbInformation, "Comment" iStatus = RARReadHeader(lHandle, uHeader) Do Until iStatus <> 0 RARProcessFile lHandle, RAR_EXTRACT, EndFil, "" Timeout 5& iStatus = RARReadHeader(lHandle, uHeader) Loop If iStatus <> ERAR_BAD_DATA Then RARCloseArchive lHandle: Exit Sub MsgBox "Error Password!", vbCritical, "Error!": End End Sub
обьявите нормально прототипы функций, уберите эти ужасные асм вставки, которые взрывают голову и в которых скорее всего ошибка.