113 lines
2.3 KiB
C++
113 lines
2.3 KiB
C++
#ifndef __FDI_D_H_INCLUDED__
|
|
#define __FDI_D_H_INCLUDED__
|
|
|
|
#include "fdi.h"
|
|
|
|
// FDI.DLL delay-load class
|
|
|
|
class CFdiDll
|
|
{
|
|
public:
|
|
#define DELAY_FDI_HFDI(_fn, _args, _nargs) \
|
|
HFDI _fn _args { \
|
|
HRESULT hres = Init(); \
|
|
HFDI hfdi; \
|
|
if (SUCCEEDED(hres)) { \
|
|
hfdi = _pfn##_fn _nargs; \
|
|
} \
|
|
return hfdi; } \
|
|
HFDI (FAR DIAMONDAPI* _pfn##_fn) _args;
|
|
|
|
#define DELAY_FDI_BOOL(_fn, _args, _nargs) \
|
|
BOOL _fn _args { \
|
|
HRESULT hres = Init(); \
|
|
BOOL bRet; \
|
|
if (SUCCEEDED(hres)) { \
|
|
bRet = _pfn##_fn _nargs; \
|
|
} \
|
|
return bRet; } \
|
|
BOOL (FAR DIAMONDAPI* _pfn##_fn) _args;
|
|
|
|
HRESULT Init(void);
|
|
CFdiDll(BOOL fFreeLibrary = TRUE);
|
|
~CFdiDll();
|
|
|
|
BOOL m_fInited;
|
|
BOOL m_fFreeLibrary;
|
|
HMODULE m_hMod;
|
|
|
|
DELAY_FDI_HFDI(FDICreate,
|
|
(PFNALLOC pfnalloc,
|
|
PFNFREE pfnfree,
|
|
PFNOPEN pfnopen,
|
|
PFNREAD pfnread,
|
|
PFNWRITE pfnwrite,
|
|
PFNCLOSE pfnclose,
|
|
PFNSEEK pfnseek,
|
|
int cpuType,
|
|
PERF perf),
|
|
(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf));
|
|
|
|
DELAY_FDI_BOOL(FDICopy,
|
|
(HFDI hfdi,
|
|
char *pszCabinet,
|
|
char *pszCabPath,
|
|
int flags,
|
|
PFNFDINOTIFY pfnfdin,
|
|
PFNFDIDECRYPT pfnfdid,
|
|
void *pvUser),
|
|
(hfdi, pszCabinet, pszCabPath, flags, pfnfdin, pfnfdid, pvUser));
|
|
|
|
DELAY_FDI_BOOL(FDIIsCabinet,
|
|
(HFDI hfdi,
|
|
int hf,
|
|
PFDICABINETINFO pfdici),
|
|
(hfdi, hf, pfdici));
|
|
|
|
DELAY_FDI_BOOL(FDIDestroy,
|
|
(HFDI hfdi),
|
|
(hfdi));
|
|
|
|
};
|
|
|
|
inline CFdiDll::CFdiDll(BOOL fFreeLibrary)
|
|
{
|
|
m_fInited = FALSE;
|
|
m_fFreeLibrary = fFreeLibrary;
|
|
}
|
|
|
|
inline CFdiDll::~CFdiDll()
|
|
{
|
|
if (m_fInited && m_fFreeLibrary) {
|
|
FreeLibrary(m_hMod);
|
|
}
|
|
}
|
|
|
|
inline HRESULT CFdiDll::Init(void)
|
|
{
|
|
if (m_fInited) {
|
|
return S_OK;
|
|
}
|
|
|
|
m_hMod = LoadLibrary(TEXT("CABINET.DLL"));
|
|
|
|
if (!m_hMod) {
|
|
return HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
|
|
#define CHECKAPI(_fn) \
|
|
*(FARPROC*)&(_pfn##_fn) = GetProcAddress(m_hMod, #_fn); \
|
|
if (!(_pfn##_fn)) return E_UNEXPECTED;
|
|
|
|
CHECKAPI(FDICreate);
|
|
CHECKAPI(FDICopy);
|
|
CHECKAPI(FDIIsCabinet);
|
|
CHECKAPI(FDIDestroy);
|
|
|
|
m_fInited = TRUE;
|
|
return S_OK;
|
|
}
|
|
|
|
#endif
|
|
|