#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