FDICopy приводит к сбою без журналов ошибок - PullRequest
0 голосов
/ 25 апреля 2019

Я закончил реализацию файла сжатия CAB, теперь я реализую декомпрессию, но каждый раз, когда я вызываю FDICopy или FDIIsCabinet, мое приложение зависало, поэтому я думал, что это может быть из-за способа, которым я реализовал обратные вызовы FDICreate, но все еще не могунайти какое-нибудь решение для этого

Вот функция извлечения

    FDICABINETINFO  fdici;
    int             hf;
    char            *p;

    // Set up some important globals
    g_hfdi = NULL;
    g_pFDIProgress = NULL;

    g_hfdi = FDICreate(
        fdi_mem_alloc,
        fdi_mem_free,
        fdi_file_open,
        fdi_file_read,
        fdi_file_write,
        fdi_file_close,
        fdi_file_seek,
        cpu80386,
        &g_fdi_erf
    );

    if (g_hfdi == NULL)
    {
        return FALSE;
    }

    hf = fdi_file_open(
        cCABFullPath,
        _O_BINARY | _O_RDONLY | _O_SEQUENTIAL,
        0
    );

    if (hf == -1)
    {
        return FALSE;
    }

    if ( g_hfdi != NULL) {

        if (FALSE == FDICopy(
            g_hfdi,
            "INSTALL.cab",
            "C:\\xx\\xx\\",
            0,
            notification_function,
            NULL,
            NULL))  // NULL or DEST Folder? 
        {
                PRINTF(
                    "FDICOPY() FAILED: CODE %D [%S]\N",
                      g_fdi_erf.ERFOPER
                );

            return FALSE;
        }
    }

    if (FALSE == FDIIsCabinet(
            g_hfdi,
            hf,
            &fdici))
    {
        /*
         * No, it's not a cabinet!
         */
        _close(hf);
        PRINTF(
                    "FDICOPY() FAILED: CODE %D [%S]\N",
                      g_fdi_erf.ERFOPER
                );
        return FALSE;
    }

И это связанные обратные вызовы, используемые FDICreate

FNALLOC(fdi_mem_alloc)
{
    return malloc(cb);
}

/*
 * Memory free function
 */
FNFREE(fdi_mem_free)
{   
    free(memory);
}

FNOPEN(fdi_file_open)
{
#if _MSC_VER >= 1500
    int fh;
    return _sopen_s(&fh, pszFile, oflag, _SH_DENYNO, pmode);
#else
    return _open(pszFile, oflag, pmode);
#endif
}


FNREAD(fdi_file_read)
{
    return _read(hf, pv, cb);
}


FNWRITE(fdi_file_write)
{
    return _write(hf, pv, cb);
}


FNCLOSE(fdi_file_close)
{
    return _close(hf);
}


FNSEEK(fdi_file_seek)
{
    return _lseek(hf, dist, seektype);
}

Я не поместил функцию уведомленийобратный вызов, так как он очень длинный

Отладив его, я вижу, что g_hfdi фактически получает адрес и hf = 0, но как только он достигает функции FDICopy, он просто падает, не давая мнедаже проверить ошибку, и если я переместу кусок кода FDIIsCabinet выше предыдущего, он просто возвращает false, не давая мне проверить что-либо еще раз.

...