Über C++ mit unrar.dll .rar Datein entpacken

  • Nach mehreren Stunden googel suche, was mich leider nicht sehr weit gebracht, dazu kommen wohl auch fehlende englisch Kentnisse, komm ich zum schluss: Ich find den Befehl zum entpacken nicht, den ich in C++ eingeben muss.

    Im genaueren will ich ein programm schreiben, bei der eine .rar Datein, welche ihren Ort nicht verändert, am selben Ort entpackt und nicht mehr macht.
    Recht simpel und man könnte es auch manuel machen, aber da ich jeden Tag .rar datein enpacken muss, welche am selben ort sind ist es nervend.

    Es wäre eine große Hilfe wenn man ein einfach den kompletten befehl hinschreiben könnte mit einer beispiel.rar. Ich sah schon ein paar Programmtexte, welche ich leider nicht verstand ?( und mich wieder zum anfang brachte. :D

    Bessere bibliotheken, falls vorhanden, sind auch erwüscht und am liebes auch mit einem kleinen Programmmbeispiel. :thumbup:

    Um vorzubeugen:
    Sachen wie: "hier erste link Google" hab ich schon von 10 vorhergehenden artikel, welche nicht ich gestartet habe, gelesen, darum bitte ich einfach nur ein Beispiel ohne das ich jetzt nochmal micht durch 4 weitere seiten klicken muss zu schreiben. ;(
    Und ich möchte ein Programm schreiben und kein vorgefertigtes Programm nutzen oder in Winrar Einstellungen vollrichten.

    Daten: Win 7 Professional 32 bit; Visual C++ 2010 Express, unrar.dll

  • Falsche Sektion, das hier ist die AutoIt Sektion und nicht andere Programmiersprachen.
    Warum so etwas unbedingt in C++ machen? In AutoIt gibts dafür schon UDFs die man einfach verwenden kann.

    Solltest du auf C++ bestehen gibt es im Internet sicherlich Referenzen zu unRAR.dll (http://goahomepage.free.fr/article/2000_0…l/UnRARDLL.html)
    Die Englischkentnisse die du dafür brauchst kriegst du per Google Translate.

    Funktionen DLLImporten und richtig callen.

  • Hier ein beispiel laut der Dokumentation:

    EDIT: Arrg man immer diese Formatierung hier zur not ein pastebin link
    http://pastebin.com/quhybU80

    Spoiler anzeigen
    [autoit]

    #include <iostream>#include <iomanip>#include <string>#include <Windows.h>#include "unrar.h"
    enum { EXTRACT, TEST, PRINT, LIST };
    void ExtractArchive(char* ArcName, int Mode);void ListArchive(char* ArcName);void ShowComment(char* CmtBuf);void OutHelp(void);
    enum ERR_TYPE { ERR_OPEN, ERR_READ, ERR_PROCESS };void OutError(int Error, char* ArcName, int ErrType);
    void ShowArcInfo(unsigned int Flags, char* ArcName);void OutProcessFileError(int Error);int CALLBACK CallbackProc(UINT msg, LPARAM UserData, LPARAM P1, LPARAM P2);

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    int main(int nArgs, char** szArgs){
    char* szPath = "I:\\Projekte\\Visual_Studio\\Unrar\\Beispiel.rar"; ExtractArchive(szPath, EXTRACT);
    return 0;//EXIT_SUCCESS}

    [/autoit] [autoit][/autoit] [autoit]

    void ExtractArchive(char* ArcName, int Mode){ HANDLE hArcData; int RHCode, PFCode; char CmtBuf[16384]; struct RARHeaderData HeaderData; struct RAROpenArchiveDataEx OpenArchiveData;
    memset(&OpenArchiveData, 0, sizeof(OpenArchiveData)); OpenArchiveData.ArcName = ArcName; OpenArchiveData.CmtBuf = CmtBuf; OpenArchiveData.CmtBufSize = sizeof(CmtBuf); OpenArchiveData.OpenMode = RAR_OM_EXTRACT; OpenArchiveData.Callback = CallbackProc; OpenArchiveData.UserData = Mode; hArcData = RAROpenArchiveEx(&OpenArchiveData);
    if (OpenArchiveData.OpenResult != 0) { OutError(OpenArchiveData.OpenResult, ArcName, ERR_OPEN); return; }
    ShowArcInfo(OpenArchiveData.Flags, ArcName);
    if (OpenArchiveData.CmtState == 1) { ShowComment(CmtBuf); }
    // Obsolete, use RAROpenArchiveDataEx callback fields above. // RARSetCallback(hArcData,CallbackProc,(LPARAM)&Mode);
    HeaderData.CmtBuf = NULL; memset(&OpenArchiveData.Reserved, 0, sizeof(OpenArchiveData.Reserved));
    while ((RHCode = RARReadHeader(hArcData, &HeaderData)) == 0) { switch (Mode) { case EXTRACT: printf("\nExtracting %-45s", HeaderData.FileName); break; case TEST: printf("\nTesting %-45s", HeaderData.FileName); break; case PRINT: printf("\nPrinting %-45s\n", HeaderData.FileName); break; } PFCode = RARProcessFile(hArcData, (Mode == EXTRACT) ? RAR_EXTRACT : RAR_TEST, NULL, NULL); if (PFCode == 0) { printf(" OK"); } else { OutError(PFCode, ArcName, ERR_PROCESS); break; } }
    OutError(RHCode, ArcName, ERR_READ);
    RARCloseArchive(hArcData);}

    [/autoit] [autoit][/autoit] [autoit]

    void ListArchive(char* ArcName){ HANDLE hArcData; int RHCode, PFCode; char CmtBuf[16384]; struct RARHeaderDataEx HeaderData; struct RAROpenArchiveDataEx OpenArchiveData;
    memset(&OpenArchiveData, 0, sizeof(OpenArchiveData)); OpenArchiveData.ArcName = ArcName; OpenArchiveData.CmtBuf = CmtBuf; OpenArchiveData.CmtBufSize = sizeof(CmtBuf); OpenArchiveData.OpenMode = RAR_OM_LIST; OpenArchiveData.Callback = CallbackProc; OpenArchiveData.UserData = LIST; hArcData = RAROpenArchiveEx(&OpenArchiveData);
    if (OpenArchiveData.OpenResult != 0) { OutError(OpenArchiveData.OpenResult, ArcName, ERR_OPEN); return; }
    ShowArcInfo(OpenArchiveData.Flags, ArcName);
    if (OpenArchiveData.CmtState == 1) { ShowComment(CmtBuf); }
    // Obsolete, use RAROpenArchiveDataEx callback fields above. // RARSetCallback(hArcData,CallbackProc,0);
    HeaderData.CmtBuf = NULL; memset(&OpenArchiveData.Reserved, 0, sizeof(OpenArchiveData.Reserved));
    printf("\nFile Size"); printf("\n-------------------------------"); while ((RHCode = RARReadHeaderEx(hArcData, &HeaderData)) == 0) { __int64 UnpSize = HeaderData.UnpSize + (((__int64)HeaderData.UnpSizeHigh) << 32); printf("\n%-20s %10Ld ", HeaderData.FileName, UnpSize); if ((PFCode = RARProcessFile(hArcData, RAR_SKIP, NULL, NULL)) != 0) { OutError(PFCode, ArcName, ERR_PROCESS); break; } }
    OutError(RHCode, ArcName, ERR_READ);
    RARCloseArchive(hArcData);}

    [/autoit] [autoit][/autoit] [autoit]

    void ShowComment(char* CmtBuf){ printf("\nComment:\n%s\n", CmtBuf);}

    [/autoit] [autoit][/autoit] [autoit]

    void OutHelp(void){ printf("\nUNRDLL. This is a simple example of UNRAR.DLL usage\n"); printf("\nSyntax:\n"); printf("\nUNRDLL X <Archive> extract archive contents"); printf("\nUNRDLL T <Archive> test archive contents"); printf("\nUNRDLL P <Archive> print archive contents to stdout"); printf("\nUNRDLL L <Archive> view archive contents\n");}

    [/autoit] [autoit][/autoit] [autoit]

    void OutError(int Error, char* ArcName, int ErrType){ switch (Error) { case ERAR_NO_MEMORY: printf("\nNot enough memory"); break; case ERAR_BAD_DATA: printf("\n%s: archive header or data are damaged", ArcName); break; case ERAR_BAD_ARCHIVE: printf("\n%s is not RAR archive", ArcName); break; case ERAR_UNKNOWN_FORMAT: printf("Unknown archive format"); break; case ERAR_EOPEN: if (ErrType == ERR_PROCESS) // Returned by RARProcessFile. { printf("Volume open error"); } else { printf("\nCannot open %s", ArcName); } break; case ERAR_ECREATE: printf("File create error"); break; case ERAR_ECLOSE: printf("File close error"); break; case ERAR_EREAD: printf("Read error"); break; case ERAR_EWRITE: printf("Write error"); break; case ERAR_SMALL_BUF: printf("Buffer for archive comment is too small, comment truncated"); break; case ERAR_UNKNOWN: printf("Unknown error"); break; case ERAR_MISSING_PASSWORD: printf("Password for encrypted file or header is not specified"); break; case ERAR_EREFERENCE: printf("Cannot open file source for reference record"); break; case ERAR_BAD_PASSWORD: printf("Wrong password is specified"); break; }}

    [/autoit] [autoit][/autoit] [autoit]

    void ShowArcInfo(unsigned int Flags, char* ArcName){ printf("\nArchive %s\n", ArcName); printf("\nVolume:\t\t%s", (Flags & 1) ? "yes" : "no"); printf("\nComment:\t%s", (Flags & 2) ? "yes" : "no"); printf("\nLocked:\t\t%s", (Flags & 4) ? "yes" : "no"); printf("\nSolid:\t\t%s", (Flags & 8) ? "yes" : "no"); printf("\nNew naming:\t%s", (Flags & 16) ? "yes" : "no"); printf("\nRecovery:\t%s", (Flags & 64) ? "yes" : "no"); printf("\nEncr.headers:\t%s", (Flags & 128) ? "yes" : "no"); printf("\nFirst volume:\t%s", (Flags & 256) ? "yes" : "no or older than 3.0"); printf("\n---------------------------\n");}

    [/autoit] [autoit][/autoit] [autoit]

    int CALLBACK CallbackProc(UINT msg, LPARAM UserData, LPARAM P1, LPARAM P2){ switch (msg) { case UCM_CHANGEVOLUMEW: if (P2 == RAR_VOL_ASK) { printf("\n\nVolume %S is required\nPossible options:\n", (wchar_t*)P1); printf("\nEnter - try again"); printf("\n'R' - specify a new volume name"); printf("\n'Q' - quit"); printf("\nEnter your choice: "); switch (toupper(getchar())) { case 'Q': return(-1); case 'R': { wchar_t* eol; printf("\nEnter new name: "); fflush(stdin);
    // fgetws may fail to read non-English characters from stdin // in some compilers. In this case use something more // appropriate for Unicode input. fgetws((wchar_t*)P1, MAX_PATH, stdin);
    eol = wcspbrk((wchar_t*)P1, L"\r\n"); if (eol != NULL) { *eol = 0; } } return(1); default: return(1); } } if (P2 == RAR_VOL_NOTIFY) { printf("\n ... volume %S\n", (wchar_t*)P1); } return(1); case UCM_PROCESSDATA: if (UserData == PRINT) { fflush(stdout); fwrite((char*)P1, 1, P2, stdout); fflush(stdout); } return(1); case UCM_NEEDPASSWORDW: { wchar_t* eol; printf("\nPassword required: ");
    // fgetws may fail to read non-English characters from stdin // in some compilers. In this case use something more appropriate // for Unicode input. fgetws((wchar_t*)P1, P2, stdin);
    eol = wcspbrk((wchar_t*)P1, L"\r\n"); if (eol != NULL) { *eol = 0; } } return(1); } return(0);}

    [/autoit]




    Ich habe das Projekt mit VS2013 Ultimate erstellt. Im Anhang.
    Nicht vergessen die LIB in den Eigenschaften hinzuzufügen.
    Und die DLL ins Ausgabe Verzeichnis kopieren oder angeben.