Я закончил реализацию файла сжатия 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, не давая мне проверить что-либо еще раз.